我正在使用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}%"
]
]
],
]
]);
第一部分可以工作,但不包含任何内容。
答案 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
子句,则可以始终将其指定为字符串。