首页 > 解决方案 > 如何构建 Eloquent 查询来检索主表的记录,在 Laravel 5 PHP 的相关表上应用 where 子句?

问题描述

使用 Laravel 文档中的示例多对多多态 relaltionshiop 数据库结构,如下所示:

posts
  id - integer
  name - string

videos
  id - integer
  name - string

tags
  id - integer
  name - string

taggables
  tag_id - integer
  taggable_id - integer
  taggable_type - string

我想检索OR的post记录。post.name LIKE %laravel%tags.name LIKE %laravel%

如何使用 Eloquent 模型构建这样的查询?这对我来说是一个很大的挑战,因为我只想获取其名称由单词组成的laravel帖子,或者其相关标签的名称由相同单词组成的任何帖子。

标签: phplaravel-5many-to-manypolymorphic-relationship

解决方案


你可以用whereHas这个。

文档

如果您需要更多功能,您可以使用 whereHas 和 orWhereHas 方法将“where”条件放在您的 has 查询上。这些方法允许您将自定义约束添加到关系约束,例如检查评论的内容

use Illuminate\Database\Eloquent\Builder;

// Retrieve posts with at least one comment containing words like foo%...
$posts = App\Post::whereHas('comments', function (Builder $query) {
    $query->where('content', 'like', 'foo%');
})->get();

在你的情况下,它会是这样的:

use Illuminate\Database\Eloquent\Builder;

$input = 'laravel';

Post::whereHas('tags', function (Builder $query) use ($input) {
    $query->where('name', 'like', '%' . $input .'%');
})->orWhere('name', 'like', '%' . $input . '%')->get();

推荐阅读