使用具有条件的Paginate并包含CakePHP

时间:2012-12-29 20:30:32

标签: cakephp pagination conditional-statements contain

所以,我想对我的一个请求进行分页。 “正常的方式”似乎不能很好地工作,所以,我做了一些研究,所有的答案都告诉他们这样做:

$this->paginate("Like",
    array("Like.user_id" => $id),
    array(
        "order" => "Like.created desc",
        "contain" => array(
            "User",
            "Post",
            "Post.User",
            "Post.Like"
        )
    )
);

问题是......它不起作用。 debug给了我类似的东西:

array(
    (int) 0 => array(
        'Like' => array(
            'id' => '38',
            'created' => '2012-10-03 21:21:27',
            'post_id' => '29',
            'user_id' => '19'
        ),
        'Post' => array(
            'id' => '29',
            'title' => 'Don't Panic',
            'description' => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam elementum sem ac sem imperdiet cursus. Quisque venenatis pulvinar ornare. Donec rutrum, lacus vel imperdiet sagittis, metus risus interdum ante, iaculis venenatis arcu nibh et odio.',
            'image' => '29-c49cb96c.jpg',
            'model' => '',
            'created' => '2012-09-07 01:46:49',
            'user_id' => '19',
            'project_id' => '1',
            'like_count' => '1'
        ),
        'User' => array(
            'password' => '*****',
            'id' => '19',
            'username' => 'Axiol'
        )
    )
)

没有Post.UserPost.Like ...

的痕迹

有什么想法吗?

编辑:

以下是模型关联:

发布

public $belongsTo = array("User", "Project");
public $hasMany = array("Comment", "Like");

public $belongsTo = array("User", "Post" => array("counterCache" => true));

用户

public $hasMany = array("Post", "Comment");

3 个答案:

答案 0 :(得分:2)

首先,当Oldskool回答时,你确实应该纠正你的contain数组。

这应该是非常明显的,因为蛋糕通过这样的东西:

Warning (512): Model "Post.Like" is not associated with model "Like" 
[CORE\Cake\Model\Behavior\ContainableBehavior.php, line 342]

由于你的实际问题,你可能没有看到它。

您没有提及是否以任何方式加载Containable行为。 我假设你不是,而且你有它。 <{1}}数组完全被忽略。

Herecontain行为的文档。 我的建议是将其添加到Containable属性中,如下所示:

AppModel::actsAs

这样,它会自动提供给您的所有模特,您也应该停止使用class AppModel extends Model { public $actsAs = array('Containable'); } 疯狂。

希望这有帮助。

答案 1 :(得分:1)

删除Post.UserPost.Like - 这些不是模型,不应列在contain数组中。

如果它们是模型名称 - 即,您已在模型中指定了$name(即使它违反了命名约定),那么请发布您的模型及其关联,我们可以进一步查看。 / p>

答案 2 :(得分:1)

正如Dave已经提到的那样,你的模型名称已关闭。您不应该使用该表示法,而是将它们作为“嵌套”模型包含在您正在加载的模型下面。像这样:

"contain" => array(
    "User",
    "Post" => array(
        "User", // Get post related user data
        "Like" // Get post related like data
    )
)