0

使用 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帖子,或者其相关标签的名称由相同单词组成的任何帖子。

4

2 回答 2

1

你可以用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();
于 2019-08-15T10:15:29.767 回答
0

这应该有效:

$result = Post::whereHas('tags', function ($query) {
    $query->where('name', 'like', '%laravel%')
        ->orWhere('tags.name', 'like', '%laravel%');
})->get();
于 2019-08-15T10:29:54.810 回答