Laravel嵌套关系

时间:2019-02-16 15:57:51

标签: laravel relationship

用户可以有很多设备,每个设备可以有很多接口。

我想让用户了解他的设备以及每个设备的界面。

用户模型

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
        'profile_image', 'retrieve_email', 'retrieve_sms'
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

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

}

设备型号

class Device extends Model
{
    public function interfaces()
    {
        return $this->hasMany('App\ModelInterface');
    }

    public function user()
    {
        return $this->belongsTo('App\User');
    }

}

ModelInterface模型

class ModelInterface extends Model
{
    public function device()
    {
        return $this->belongsTo('App\Device');
    }

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

我如何获得用户界面?

Auth::user()->devices returns all the devices and works.

我怎么可能说

Auther::user()->devices->interfaces

3 个答案:

答案 0 :(得分:0)

您需要查看HasManyThrough关系。

  

“具有多次通过”关系为通过中间关系访问远处的关系提供了方便的快捷方式。例如,一个国家(地区)模型可能通过一个中间用户模型具有许多邮政模型。在此示例中,您可以轻松地收集给定国家/地区的所有博客文章。

您的用户模型中的这些内容如下:

return $this->hasManyThrough('App\Interface', 'App\Device');

因为您的用户通过其设备 有许多接口。

答案 1 :(得分:0)

您可以遍历设备并获取每个设备的接口。

foreach(Auth::user()->devices as $device)
{
   foreach($device->interfaces as $interface)
   {
       // do whatever you want
   }
}

答案 2 :(得分:0)

您可以使用:

$id = Auth::user()->id;

$userwithDetails = User::with('devices', 'devices.interfaces')->where('id', $id)->first();

这将为您提供该用户所有设备的集合,每个设备将具有属于该设备的另一接口集合。