让我们说模型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(不是子查询)生成单个查询。可能吗?
答案 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。