Как построить запрос 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();