Yii'限制'相关模型的范围

时间:2014-08-21 10:35:50

标签: php mysql yii limit

我有一个名为Guesses的模型has_many评论。我正在对此进行热切查询,然后将其作为JSON传递给API调用。

关系显然是在两个模型之间设置的,并且它们是正确的(one2many< => belongs2)

我在这个名为'api'的评论中添加了一个范围:

public function scopes()
    {
        return array(
            'api' => array(
                'select' => 'id, comment, date',
                'limit'=>3,
                'order'=>'date DESC',
                'together'=>true,
            ),
        );
    }

我正在运行以下单行查询:

$data = Guesses::model()->with('comments:api')->findAll();

这里的问题是,当使用with('relation')调用'api'范围时, limit 属性根本不适用。 我在其他类型的范围中添加了'together'=> true,而且我听说它可能有所帮助。它没有什么区别。

我不需要所有猜测的所有评论。我想要前3名(或5名)。我也试图保持单线调用完整和简单,通过范围,关系和参数化函数管理所有内容,以便API调用本身干净简单。

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

我知道有几种方法可以达到这个目的。

第一。您可以为关系添加限制,例如

    'photos' => array(self::HAS_MANY, 'Photo', 'companyId', 
                      'limit'=>3
                )

第二。您可以在呼叫关系时调用限制结果,例如

$model->photos(array('limit' => 4));

也许有其他方法,但我不知道。

答案 1 :(得分:0)

根据documentation,这应该没问题。

我唯一的建议是:

$data = Guesses::model()->with(
   array('comments'=>array('scopes'=>array('api')))
)->findAll();

或:

$data = Guesses::model()->findAll(array(
  'with'=>array('comments'=>array('scopes'=>array('api')))
));

但这应该是相同的逻辑。我不认为together会帮助你......默认情况下这是真的。

<强>更新

这些示例直接来自relational documentation

$posts=Post::model()->with('comments:recently:approved')->findAll();

或从1.1.7开始:

$posts=Post::model()->with(array(
    'comments'=>array(
        'scopes'=>array('recently','approved')
    ),
))->findAll();

或自1.1.7起

$posts=Post::model()->findAll(array(
    'with'=>array(
        'comments'=>array(
            'scopes'=>array('recently','approved')
        ),
    ),
));

和延迟加载:

$approvedComments = $post->comments('comments:approved');

这表明您的代码应该有效..您的跟踪中正在运行什么查询? 您是否有任何默认范围尚未发布?他们的关系中是否定义了任何额外的选项?我遇到了这两个干扰命名范围的问题。