【发布时间】:2021-01-22 11:20:27
【问题描述】:
我正在尝试开发一个与 postmeta 模型具有一对多关系的 post 模型(包括 id、post_id、meta_key、meta_value 列)并且还具有多对多关系与术语模型的许多关系(包括term_id 和其他一些列,以及包括id、post_postId、term_term_term_id 列的post_term 表)。
我创建了一个表单,其中包含一些 post_metas 和术语,用于搜索和过滤我的帖子。
这个示例 PHP 代码突出显示了我使用的内容:
$posts_query = Post::where('post_type', 'add')->where('author', Auth::id())->where(function ($q0) use($filter_metas){
foreach ($filter_metas as $index => $meta) {
$q0->whereHas('postmetas', function ($q0) use ($index,$meta) {
$q0->where('meta_key', $index)->where('meta_value', $meta);
});
}
});
这是执行查询以获得结果。
select * from `posts` where `post_type` = ? and `author` = ? and (exists (select * from `postmeta` where `posts`.`postId` = `postmeta`.`post_id` and `meta_key` = ?) and exists (select * from `postmeta` where `posts`.`postId` = `postmeta`.`post_id` and `meta_key` = ? and `meta_value` in (?, ?, ?, ?)) and exists (select * from `postmeta` where `posts`.`postId` = `postmeta`.`post_id` and `meta_key` = ? and `meta_value` in (?, ?, ?)) and exists (select * from `postmeta` where `posts`.`postId` = `postmeta`.`post_id` and `meta_key` = ? and `meta_value` > ?) and exists (select * from `postmeta` where `posts`.`postId` = `postmeta`.`post_id` and `meta_key` = ? and `meta_value` = ?) and exists (select * from `postmeta` where `posts`.`postId` = `postmeta`.`post_id` and `meta_key` = ? and `meta_value` = ?) and exists (select * from `postmeta` where `posts`.`postId` = `postmeta`.`post_id` and `meta_key` = ? and `meta_value` = ?) and exists (select * from `postmeta` where `posts`.`postId` = `postmeta`.`post_id` and `meta_key` = ? and `meta_value` = ?) and exists (select * from `postmeta` where `posts`.`postId` = `postmeta`.`post_id` and `meta_key` = ? and `meta_value` = ?) and exists (select * from `postmeta` where `posts`.`postId` = `postmeta`.`post_id` and `meta_key` = ? and `meta_value` = ?)
我可以从此查询中获得正确的结果,但查询执行速度太慢,这是我的主要问题。有什么替代方法吗?
【问题讨论】:
-
如果你有更多的记录,尽量不要使用 whereHas。如果您真的想使用 whereHas,请添加索引。我之前遇到过同样的问题,我使用了联接。
-
您好,感谢您的评论,您能再解释一下吗?或者只是与我分享一个如何做的例子?
标签: php mysql laravel eloquent entity-attribute-value