如何从联接表中选择列:laravel雄辩

Ani*_*abu 5 php laravel eloquent laravel-eloquent

我有一个与不同的问题。情况是相同的,但我需要对结果进行更多过滤。

让我解释。

考虑我有2张桌子

车辆

 id
 name
 staff_id
 distance
 mileage
Run Code Online (Sandbox Code Playgroud)

员工

 id
 name
 designation
Run Code Online (Sandbox Code Playgroud)

我只想选择,id并且name要从两个表(模型)中选择。车辆模型包含belongsTo与职员模型的关系。

class Vehicle extends Model
{
    public function staff()
    {
      return $this->belongsTo('App\Staff','staff_id');
    }
}
Run Code Online (Sandbox Code Playgroud)

我加入了这个

Vehicle::where('id',1)
            ->with(['staff'=> function($query){
                            // selecting fields from staff table
                            $query->select(['staff.id','staff.name']);
                          }])
            ->get();
Run Code Online (Sandbox Code Playgroud)

当我->get()像这样放置字段时

->get(['id','name'])
Run Code Online (Sandbox Code Playgroud)

它过滤vehicle表,但不产生Staff表的结果。

有任何想法吗?

Sag*_*tam 7

您可以像这样使用普通连接:

Vehicle::join('staff','vehicles.staff_id','staff.id')
         ->select(
                  'vehicles.id',
                  'vehicles.name',
                  'staff.id as staff_id',
                  'staff.name'
          )
         ->get();
Run Code Online (Sandbox Code Playgroud)

因为,你不能id在一个连接中同时使用这两个,因为只允许一个。因此,您可以将员工的 id 设为staff_id

您可以使用 where 子句添加车辆 ID 条件,例如:

Vehicle::join('staff','vehicles.staff_id','staff.id')
         ->where('vehicle.id',1)
         ->select(
                  'vehicles.id',
                  'vehicles.name',
                  'staff.id as staff_id',
                  'staff.name'
          )
         ->get();
Run Code Online (Sandbox Code Playgroud)

希望你能理解。


Ani*_*abu 6

终于找到它了。在中,->get()您必须像这样放置“ staff_id”

Vehicle::where('id',1)
            ->with(['staff'=> function($query){
                            // selecting fields from staff table
                            $query->select(['staff.id','staff.name']);
                          }])
            ->get(['id','name','staff_id']);
Run Code Online (Sandbox Code Playgroud)

由于我没有使用staff_id,所以它无法执行联接,因此不会显示人员表字段。