2012-12-06 28 views
2

使用锂框架,我有两个模型类,Post和Image。他们通过hasMany关系相关。锂(li3)的订单和限制已有许多相关数据

//Post.php 
class Post extends \lithium\data\Model { 
    public $hasMany = array('Image'); 
} 

在我在我的PostsController查询之一,我试图找到由一个排序图片一发布,并有一个限度。但是图像上的顺序和限制选项被忽略。这里是我的查询看起来是这样的:

//PostsController.php 
$post = Post::find('first', array(
    'with'=>array(
     'Image'=>array(
      'order'=>array('position'=>'ASC'), 
      'limit'=>3 
     ) 
    ), 
    'conditions'=>array(
     'Post.id'=>'some-id-value' 
    ) 
)); 

这个特定的查询将返回其所有相关图片,不排序的职位“的位置。”例如,如果这篇文章有10张相关的图像,则所有10张图像都将随其返回,而不仅仅是按位置排序的3的限制。

一般来说,这个想法是我希望能够订购和限制模型的相关hasMany数据。这可能与Lithium中的hasMany关系有关吗?或者无论如何hasMany总是会返回所有相关数据?很显然,我正在尝试的不是正确的做法。

回答

1

这里是你如何使用ORDER BY与锂的关系......

$table1_table2 = Table1::find('all', array(
    'conditions' => array('Table1.foo' => 'bar'), 
    'with' => array('Table2'), 
    'order' => array('Table2.title'), 
    'limit' => 3 
)); 

注意'Table2.title'其无线本地环路导致类似...

SELECT ... ORDER BY Table2.title;

ASC在这暗示情况,但您也可以通过ASC或DESC。

+0

感谢您的答复。这是对的。但是,我仍然无法弄清楚如何强制执行相关数据的限制(即表2)。作为解决办法,我在Table2上传递一个条件来匹配一个基本上只返回我需要的相关数据的值。对于我的目的(和模式),这与限制和排序数据的作用相同。无论如何,我仍然想知道如何限制拥有大量数据的属性,即使只是出于纯粹的好奇心。 – bar1024

0

你可以添加最后的查询,你需要吗?据我所知,MySQL不能在JOIN中限制和排序,只能在子查询中进行。

因此,在这种情况下,2个请求优于1加入:

第一Post::find(...conditions...)然后

$images = Image::find(array(
    'order' => array('post_id','position'), 
    'limit' => 3, 
    'conditions' => array(
     'post_id' => $array_of_post_id_from_first_query 
    ) 
);