Как построить запрос Eloquent для извлечения записей из основной таблицы, применяя условие where к соответствующей таблице в Laravel 5 PHP?

Используя образец многомерной полиморфной структуры базы данных relaltionshiop из документации Laravel следующим образом:

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

Я хотел бы получить post записи где post.name LIKE %laravel% ИЛИ ЖЕ tags.name LIKE %laravel%,

Как использовать модель Eloquent для построения такого запроса? Это большая проблема для меня, так как я хочу получать только сообщения, название которых состоит из слова laravel ИЛИ любые сообщения, чьи связанные теги имеют название, состоящее из одного и того же слова.

2 ответа

Решение

Вы можете использовать whereHas за это.

Из документов:

Если вам требуется еще больше возможностей, вы можете использовать методы whereHas и orWhereHas для установки условий "где" в ваших запросах 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();

Это должно работать:

$result = Post::whereHas('tags', function ($query) {
    $query->where('name', 'like', '%laravel%')
        ->orWhere('tags.name', 'like', '%laravel%');
})->get();
Другие вопросы по тегам