提问者:小点点

Laravel雄辩:有很多很多的关系


在我的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方法似乎不起作用。

谢谢你的帮助!


共1个答案

匿名用户

我还没有测试过这个。然而,应该可以通过循环遍历所有用户旅程,创建一个车辆数组并将其作为集合返回,从而获得所有车辆

这可以添加到您的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)-