在我的Laravel 5.7模型中,我有以下类(此处简化):
交通工具PHP
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Vehicle extends Model
{
public function journeys()
{
return $this->hasMany('App\Journey');
}
}
旅程PHP
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Journey extends Model
{
public function vehicle()
{
return $this->belongsTo('App\Vehicle');
}
public function users()
{
return $this->belongsToMany('App\User');
}
}
用户. PHP
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
public function journeys()
{
return $this->belongsToMany('App\Journey');
}
}
我有一个介于用户和旅程之间的中间表(journey_user)(参见附加的模式)。
我可以很容易地获得特定用户的所有旅程。但是我如何获得特定用户使用的所有车辆?由于用户和旅程之间的多对多关系,标准的hasManyPass方法似乎不起作用。
谢谢你的帮助!
我还没有测试过这个。然而,应该可以通过循环遍历所有用户
的旅程
,创建一个车辆数组并将其作为集合
返回,从而获得所有车辆
。
这可以添加到您的User.php
模型控制器:
/**
* Get all vehicles which user has used
*
*/
public function vehicles()
{
$vehicles = [];
$this->journeys()
->each(function ($journey, $key) use (&$vehicles) {
$vehicles[] = $journey->vehicle;
});
return collect($vehicles);
}
这里,我们创建一个空数组。然后我们循环浏览用户的所有行程(将$vehicles
数组作为更新它的引用)。
我们使用each()。我们在
$vehicles
数组中创建一个新条目,添加vehicles
。
最后,我们返回所有车辆
作为集合。
我们可以在应用程序中这样使用:
User::find($id)->vehicles();
注意:您可以通过将函数名更改为setVehiclesAttribute()
将其作为访问器属性返回。这将允许您访问车辆字段,如User::find($id)-