锂(li3)的订单和限制有很多相关数据

时间:2012-12-06 21:10:36

标签: php lithium

使用Lithium框架,我有两个模型类,Post和Image。它们通过hasMany关系相关。

//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总是会返回所有相关数据,无论如何?显然,我所尝试的并不是正确的做法。

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分: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
   )
);