渴望加载到哪里

时间:2014-12-16 18:01:55

标签: php laravel laravel-4 eloquent eager-loading

我想按汽车内容列出所有车库,但是即使汽车没有找到,我仍然在做关于车库的信息,反之亦然,而不是没有回复,车库返回,车关系为空。

让我举一个例子:

$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');
    }       
}

2 个答案:

答案 0 :(得分:2)

你可以使用它。

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

<强>更新 我找到了另一种方法来做这件事。

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

答案 1 :(得分: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;
}