Eloquent 三重关系

Eloquent triple relation

我很难理解如何在 Laravel 中对三重关系建模。

我有 3 个模型:User、Tour 和 Photo

每个游览都有与之关联的用户,所有用户都可以 post 照片。这意味着数据库看起来像这样:

id , tour_id, user_id, photo_id

这样我就知道哪个用户post为哪个游览编辑了哪张照片。我的问题是,如何在 Eloquent 中对此建模?

你应该有:一对多游览>用户和 一对多 用户 > 照片

在您的 Tour 模型中包含此功能。

public function allusers()
    {
        return $this->hasMany(User::class);
    }

这在您的用户模型中。

public function allphotos()
    {
        return $this->hasMany(Photos::class);
    }

那你就可以去参观了$tour = Tour::find(1);

然后使用该功能来获取用户:

$usersOnTour = $tour->allusers();

首先确保您的 tour model 中有 user_id 外键字段, user moel

中有 'photo_id' 外键字段

诀窍是让 user modelphoto model 建立 hasOne/hasMany 关系,然后让 tour model 与 [=15] 建立 hasOne/hasMany 关系=].

1 - 首先在您的 user model 中定义这样的关系

public function photo()
{
    return $this->hasOne('App\Photo');
}

2 - 在你的 tour model 中定义一个像这样的 hasMany 关系

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

所以当你获取像

这样的旅游模型时

$a = tour::All(); 你可以做 $a->users->'field_in_user_table' or $a->users->photo; // to get the photo field value from photo table

根据您最后的评论更新。

您问题的最简单答案是使用关系 belongsToManyhasMany.

让我解释一下。 您需要 4 table 位用户、游览、tour_user 和照片。

用户 table 包含 id,name

tours table contain id,name,

tour_user table包含id,tour_id,user_id

照片table包含id,姓名,user_id,tour_id

为什么 belongsToMany?因为每个用户都有不止一次的游览,而每个游览都有不止一个用户。所以我们 link 通过使用第三个 table tour_user 两个 tables。它还有助于规范化。

现在我们已经检查了关系的 table 结构,让我们在用户模型上定义它:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{

    public function tours()
    {
        return $this->belongsToMany('App\Tour');
    }
    /* To retrieve photos of a user */
    public function photos()
    {
        return $this->hasMany('App\Photo');
    }

}

游览模型:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Tour extends Model
{

    public function users()
    {
        return $this->belongsToMany('App\User');
    }
    /* To retrieve photos of a tour*/
    public function photos()
    {
        return $this->hasMany('App\Photo');
    }

}

现在照片模特:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Photo extends Model
{

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

}

现在让我们使用

查找特定用户的所有游览
public function show($id)
{
    $user = User::find($id);
    return view('show')->withUser($user) ;
}

现在在显示视图中,页面可以提取该用户及其照片的所有游览

@foreach($user->tours as $tour)
     {{ $tour->name }}
     @foreach($tour->photos as $photo)
         @if($user->id == $photo->user_id)
         {{ $photo->name }}
         @endif
     @endforeach
@endforeach