cakephp包含带回所有结果

时间:2015-10-23 23:56:45

标签: cakephp cakephp-2.5

我正在使用cakephp 2.5并试图让一个包含工作

public function ajax($searchTerm = null)
    {
        $this->loadModel('Post');
        $posts = $this->Post->find("all", [
            'contain' => [
                'Comment' => [
                    'conditions' => [
                        'OR' => [
                            'Comment.content LIKE' => "%{$searchTerm}%"
                        ]
                    ]
                ],
            ]
        ]);
        var_dump($posts);
        $this->set('posts', $posts);
    }

到目前为止我用的是

public $actsAs = array('Containable');

在我的AppModel.php

无论我做什么,它只会在我的帖子中收回所有结果,而不是在相关评论中包含searchterm的结果。我已经阅读并重读了手册,并用Google搜索了自己的沮丧情绪。任何帮助将不胜感激。

我正在尝试构建一个搜索帖子或任何相关实体中的内容的搜索

这样的东西
 $posts = $this->Post->find("all", [
            'Post',
            'conditions' => [
                'OR' => [
                    'Post.title LIKE' => "%{$searchTerm}%",
                    'Post.body LIKE' => "%{$searchTerm}%"
                ]
            ],
            'contain' => [
                'Comment' => [
                    'conditions' => [
                        'OR' => [
                            'Comment.content LIKE' => "%{$searchTerm}%"
                        ]
                    ]
                ],
            ]
        ]);

第一部分可以工作,但不包含任何内容。

3 个答案:

答案 0 :(得分:0)

我猜帖子里有很多评论。

Cake不会加入表格,所以你必须自己加入。

您可以使用INNER JOIN,但最简单的方法是“反转”您的查询:搜索所有Comments及其Post,然后按Post.id分组或Comment.post_id

$posts = $this->Post->Comments->find("all", [
    'conditions' => [
        'OR' => [
            'Post.title LIKE' => "%{$searchTerm}%",
            'Post.body LIKE' => "%{$searchTerm}%",
            'Comment.content LIKE' => "%{$searchTerm}%"
        ]
    ],
    'contain' => [
        'Post' 
    ],
    'group' => ['post_id']
]);

我不确定这是实现你想要做的事情的最好方法。您还可以找到匹配评论的所有post_id,然后找到带有第二个查询的帖子

 $comments = $this->Post->Comments->find("all", [
    'fields' => 'group_id',
    'conditions' => [
        'OR' => [
            'content LIKE' => "%{$searchTerm}%"
        ],
    ] 'group' => ['post_id']
]);

$post_ids = Hash::extract($comments, '{n}.Comment.post_id');

$posts = $this->Post->find("all", [
    'conditions' => [
        'OR' => [
            'Post.title LIKE' => "%{$searchTerm}%",
            'Post.body LIKE' => "%{$searchTerm}%",
            'Post.id IN' => $post_ids
        ]
    ]);

答案 1 :(得分:0)

我认为你理解包含错误的方式(正如我所做的那样)。 无论如何,你得到所有的帖子,但是所有不满足条件的评论都会被跳过。这就是包含工作的方式。 如果您只想要包含某些评论的帖子,那么您必须更改为评论模型并设置查询。

答案 2 :(得分:-1)

试试这段代码。

$posts = $this->Post->find("all", [
        'conditions' => [
            'OR' => [
                'Post.title LIKE' => "%{$searchTerm}%",
                'Post.body LIKE' => "%{$searchTerm}%",
                "Comment.content LIKE %$searchTerm%", // You perhaps need to escape $searchTerm here
            ]
        ],
        'contain' => ['Comment']
    ]);
  

如果您发现自己无法形成WHERE子句,则可以始终将其指定为字符串。

Source