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 model
与 photo 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
根据您最后的评论更新。
您问题的最简单答案是使用关系 belongsToMany 和 hasMany.
让我解释一下。
您需要 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
我很难理解如何在 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
诀窍是让 user model
与 photo 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
根据您最后的评论更新。
您问题的最简单答案是使用关系 belongsToMany 和 hasMany.
让我解释一下。 您需要 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