Laravel Eloquent:拥有多对多关系

时间:2018-10-22 10:04:34

标签: php laravel eloquent relationship

在Laravel 5.7模型中,我有以下课程(在这里简化):

VEHICLE.PHP

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Vehicle extends Model
{

    public function journeys()
    {
        return $this->hasMany('App\Journey');
    }

}

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

USER.PHP

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{  

    public function journeys()
    {
        return $this->belongsToMany('App\Journey');
    }
}

我在用户和旅程之间有一个中间表(journey_user)(请参阅架构)。

enter image description here

我可以轻松获得特定用户的所有旅程。但是如何让特定用户使用所有车辆?由于用户和旅程之间存在多对多关系,标准的hasManyThrough方法似乎不起作用。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

我还没有测试过。但是,应该可以通过遍历所有%20的{​​{1}},创建车辆阵列并将其返回为vehicles来获得所有user

这可以添加到您的journeys模型控制器中:

collection

在这里,我们创建一个空数组。然后,我们遍历用户的所有过程(传递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()数组中创建一个新条目,并添加journey

最后,我们将所有$vehicles作为集合返回。

我们可以像这样在应用程序中使用它:

vehicle

注意:您可以通过将函数名称更改为vehicles将其作为访问者属性返回。这将使您可以访问User::find($id)->vehicles(); 之类的车辆字段。