雄辩的三重关系

时间:2017-04-24 09:51:12

标签: php laravel laravel-5 eloquent laravel-eloquent

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

我有3个型号:用户,旅游和照片

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

id,tour_id,user_id,photo_id

这样我知道哪个用户发布了哪个旅游照片。我的问题是,我如何在Eloquent中对此进行建模?

3 个答案:

答案 0 :(得分:1)

更新根据您的上一条评论。

您问题的最简单答案是使用关系 belongsToMany hasMany

让我解释一下。 您需要4个表用户,旅游,tour_user和照片。

users表包含id,name

tour表包含id,name,

tour_user表包含id,tour_id,user_id

照片表包含id,name,user_id,tour_id

为什么 belongsToMany ?因为每个用户都有多个游览,每个游览都有多个用户。所以我们使用第三个表tour_user链接两个表。它也有助于规范化。

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

<?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

答案 1 :(得分:0)

您应该:一对多巡视&gt;用户和 一对多用户&gt;照片

在Tour模型中包含此功能。

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

,这在您的用户模型中。

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

然后你可以参观$tour = Tour::find(1);

只需使用该功能即可获得用户:

$usersOnTour = $tour->allusers();

答案 2 :(得分:0)

首先确保您的user_idtour model

中的{photo_id'foriegn关键字段中有user moel个foriegn关键字段

诀窍是让user modelphoto model具有hasOne / hasMany关系,然后tour modeluser model具有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