2014-12-16 5 views
4

Я хочу перечислить все гаражи по идентификатору автомобиля, но так, как я делаю, все еще возвращается информация об гаражах, даже если автомобиль не найден, наоборот, вместо того, чтобы ничего не вернуть, гаражи возвращаются с автомобилями как пустые.Eager Loading with where

Позвольте мне в качестве примера:

$garages = Garages::with(['cars'])->get(); 

Таким образом, у меня есть все, и я не могу использовать ->where('car_id', 1), так как таблица garage не имеет car_id столбец. Единственный способ я нашел, как это:

$garages = Garages::with(['cars' => function($q) { return $q->where('car_id', 1); }])->get(); 

Проблема заключается в том, что даже если автомобиль не найден до сих пор возвращает данные из гаража, и я не хочу, потому что я хочу использовать @forelse в лезвии, и как он по-прежнему возвращает данные, @empty никогда не работает, и я получаю ошибки, говоря, что я пытаюсь получить свойства из не-объекта (конечно, машины не существуют, если не были найдены).

Есть ли способ использовать where и вернуть данные только в том случае, если они были найдены?

@edit - Отношения

class Users extends Eloquent 
{ 
    public function cars() 
    { 
     return $this->hasMany('cars'); 
    } 

    public function garages() 
    { 
     return $this->hasManyThrough('garages', 'cars', 'garage_id', 'garage_id'); 
    } 
} 

class Garages extends Eloquent 
{ 
    public function cars() 
    { 
     return $this->hasMany('cars'); 
    } 
} 

class Cars extends Eloquent 
{ 
    public function users() 
    { 
     return $this->belongsTo('users'); 
    } 

    public function garages() 
    { 
     return $this->belongsTo('Garages'); 
    }  
} 
+0

Настройте отношения «Автомобили» правильно, и это будет обрабатываться Laravel. – ceejayoz

+0

Я редактировал, и теперь вы можете видеть отношения. – yayuj

ответ

2

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

$user = User::find(1); 
$garages = $user->garages; 

foreach($garages as $garage){ 
    // just an example, you'll have to use your real properties 
    echo 'Address: ' . $garage->address; 
    echo 'Name: '. $user->name; 
} 
2

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

$garages = Garages::with(['cars' => function($q) { $q->where('car_id', 1); }]) 
        ->whereHas('cars', function($q) { $q->where('car_id', 1); }) 
        ->get(); 

Update: Я нашел еще один способ сделать это ..

$garages = Garages::has('cars') 
        ->with(['cars']) 
        ->get(); 
+0

Нет, вы не могли бы установить условие на отношения гнезд, в режиме «Иже» Загрузка данных загрузки в соответствии с отношениями Modal. Здесь у вас есть отношения от одного до многих, поэтому он вернет вам коллекцию. Таким образом, вы не можете поставить условие на коллекцию. – NULL

+0

Тогда как я могу сделать 'where' и получить информацию между отношениями hasManyThrough? - Ответ выше, вы можете видеть отношения. – yayuj

+0

Я думаю, что мой обновленный ответ вам поможет. – NULL