2017-04-24 104 views
0

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

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

每团已与它相关联的用户,所有用户都可以发布照片。这意味着数据库看起来是这样的:

ID,tour_id,USER_ID,photo_id

这样我知道哪些用户发布其照片哪个巡回赛。我的问题是,我如何在雄辩中建模?

回答

1

更新根据您的最新评论。

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

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

用户表中包含的ID,名称

旅行团表包含ID,名称,

tour_user表包含ID,tour_id邀请,USER_ID

照片表包含ID,名称,USER_ID,tour_id

为什么belongsToMany?因为每个用户都有不止一次的游览,每个游览都有不止一个用户。所以我们通过使用第三个表tour_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 
+0

我需要为给特定游览的特定用户查看照片。我没有看到这是如何解决我的问题 – kjanko

+0

使用foreach($ user-> photos作为$照片){$ photo-> name;} –

+0

@kjanko我根据您的要求完全更新回答。希望它能为你工作。 –

0

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

包括在旅游模式这一功能。

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

和这在你的用户模型。

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

然后你就可以得到一个旅游$tour = Tour::find(1);

,只是使用函数来获取这个用户:

$usersOnTour = $tour->allusers(); 
0

首先确保你在tour modeluser_id foriegn关键领域和'photo_id'foriegn你的关键字段user moel

诀窍是要有user model与一个hasOne /与photo model有很多关系,然后与user model有一个hasOne/hasMany关系的tour model

1 - 先在你user model这样定义

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

2的关系 - 在你tour model这样定义

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

所以的hasMany关系,当你取一个旅游模式像

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

+0

这将不会返回照片给定的巡演,但所有的照片,为用户属于一个某些游览。用户可以属于许多旅游。 – kjanko

+0

@kjanko哦,我以为有问题的图片用户的个人资料图片。 –