2015-09-17 7 views
0

Так что, если у меня есть моделиLaravel/Eloquent whereHasВсе решение?

Song

и

Писатель

песни и имеет много писателей

И я хочу, чтобы запросить такие песни, что я получаю только песни, где все его у писателей есть определенная область, которая истинна, каково было бы мое решение?

Функция Laravel whereHas получит все песни, в которых есть хотя бы один писатель с этим полем.

Song::whereHas('writers', function($query){ 
    $query->where('writerField', '=', true); 
}); 

Но что чистый красноречивый способ убедиться, что КАЖДОГО писателя относятся к песне, что «writerField» установлен верно?

+0

Благодаря понижающей голосования. Объяснение было бы неплохо. – jamesmpw

+0

plz. добавьте код вашей модели в свой вопрос, а также опишите, как у них есть отношения (имена полей) – num8er

ответ

0

Я нашел ответ, извините, что я забыл его опубликовать.

Ответ заключается в использовании функции подсчета и инвертирования запроса.

Song::whereHas('writers', function($query){ 
    $query->whereNull('writerField'); 
}, '=', 0); 

Я действительно ценю все ответы. Я думал, что этот вопрос был мертв из-за пониженного голоса.

-1

Я думаю, что whereHas делает внутреннее соединение, в данном случае Songs with Writers, так как это пересечение между этими двумя таблицами, на самом деле вы получаете результат, о котором вы просите. Это laracast объясняет немного того, что я сказал.

Кстати, я также ненавижу людей, которые голосуют и уходят, не сказав ничего!

+0

, поэтому это скорее комментарий, чем ответ. Вы можете попытаться ответить на него, выставив для него несколько sql, а не указывая на внешний ресурс. –

0

Моей реализация выглядит так:

песня таблицы: ID, названия и т.д.
писателей таблицы: ID, имя и т.д.
writers_songs таблица имеет: writer_id, song_id

class Song extends Model { 
    protected $table = 'songs'; 

    public final function writers() { 
     return $this->hasManyThrough('Writer', 'WriterSong'); 
    } 
} 

class WriterSong extends Eloquent { 
    protected $table = 'writers_songs'; // it has to fields: song_id, writer_id 
} 

class Writer extends Eloquent { 
    protected $table = 'writers'; 

    public final function songs() { 
     return $this->hasManyThrough('Song', 'WriterSong'); 
    } 
} 

и это, как я делаю запрос:

$Songs = Song::with('writers')->whereHas('writers')->where('title', 'like', '%hello%')->get(); 
foreach($Songs AS $Song) { 
    $Writers = $Song->writers; 
    echo "Title: ".$Song->title.'<br/>'; 
    foreach($Writers AS $Writer) { 
     echo "Writer: ".$Writer->name.'<br/>'; 
    } 
} 

это простой способ, чем держать дополнительное поле в таблице песни

+1

Оцените номер ответа. Я рассмотрю вопрос об этом. Решение, которое я нашел, отлично работает для меня. – jamesmpw

+0

приятно знать. Вы нашли ответ, но когда вам нужно сделать много для многих, вам нужно будет сделать как мои. У песни Cuz может быть много писателей, и у писателя также может быть много песен, так что это лучший способ установить отношения, это гибко. – num8er

+1

В моей системе прямо сейчас писатели уникальны и не могут принадлежать многим песням. Я должен был уточнить это с самого начала. Но большое вам спасибо за то, что вы взяли на себя. – jamesmpw

Смежные вопросы