Larevel雄辩,在单个查询中选择具有关系的模型

时间:2017-07-17 06:15:55

标签: laravel-5 eloquent laravel-eloquent

让我们说模型Car和Driver有多对多的关系:

class Car extends Model {...}

class Connection extends Model
{
    public function car()
    {
        return $this->belongsTo('app\Car');
    }

    public function driver()
    {
        return $this->belongsTo('App\Driver');
    }
}

class Driver extends Model {...}

现在我想查询可由约翰驾驶的汽车。使用QueryBuilder,这非常简单:

 $query = DB::table('cars')
        ->join('connections', 'cars.id', '=', 'connections.car_id')
        ->join('drivers', 'connection.driver_id', '=', 'drivers.id')
        ->where('drivers.name', 'like', 'John')->select('cars.*')->get();

这将生成单个SQL查询,这或多或少完全是我期望的。

应用程序的其余部分使用Eloquent进行数据库查询,因此我想用Eloquent重写此部分。我给了它多次尝试,但我不能用简单的JOIN(不是子查询)生成单个查询。可能吗?

2 个答案:

答案 0 :(得分:1)

您可以使用具有雄辩功能的where获取可以由约翰驾驶的汽车

$cars = Car::whereHas('drivers',function($query) use ($driver_name){
       $query->where('name','like','%'.$driver_name.'%');
})->get();

对于模型,您可以使用哪个@Idob来写答案。

答案 1 :(得分:0)

您可以使用belongsToMany关系并删除Connection模型。

将您的模型更改为:

class Car extends Model
{
    public function drivers()
    {
        return $this->belongsToMany(Driver::class, 'connection');
    }
}

class Driver extends Model
{
    public function cars()
    {
        return $this->belongsToMany(Car::class, 'connection');
    }
}

通过以下方式查询司机的汽车:

$drivers = Driver::with('cars')
    ->where('name', 'like', 'John')
    ->get();

foreach ($drivers as $driver) {
    $cars = $driver->cars;
}

另一个小优化是遵循Laravel的表命名约定并将connection表调用为car_driver - 而不是从belongsToMany中删除第二个参数} mathod。