Прежде всего, я надеюсь, что вы знаете, что вы делаете.Предполагая, что вам нужно получить результаты с полем can_see
, установленным в значение true, вы должны использовать:
$posts = Post::where('can_see', true)
->where(function($q) {
$q->where(function ($query1) use ($users) {
$query1->where('posted_type', 'user')->whereIn('posted_id', $users);
})->orWhere(function ($query2) use ($stores) {
$query2->where('posted_type', 'store')->whereIn('posted_id', $stores);
})
})->with('likes', 'postable')
->withCount('comments', 'likes')
->latest()
->paginate($paginate);
Как вы видите, я дополнительно завернул (где .. или где) в дополнительное закрытие where
, чтобы сделатьуверен, что будет сформирован правильный запрос.
В противном случае вы должны использовать:
$posts = Post::where(function($q) {
$q->where(function ($query1) use ($users) {
$query1->where('posted_type', 'user')->whereIn('posted_id', $users);
})->orWhere(function ($query2) use ($stores) {
$query2->where('posted_type', 'store')->whereIn('posted_id', $stores);
})
})->with('likes', 'postable')
->withCount('comments', 'likes')
->latest()
->paginate($paginate);
$posts = $posts->setCollection($posts->getCollection()->filter(function($post){
return $post->can_see == true;
})
);
Однако очень маловероятно, что 2-й способ лучше в вашем случае.Предполагая, что у вас есть 1 миллион совпадающих записей, а затем для них can_see
установлено значение true, а для остальных - false, это приведет к тому, что вы получите 1 миллион записей из базы данных, а затем отфильтруете только 10 изим, что бы убить производительность для вашего приложения.