2017-02-03 51 views
2

我无法弄清楚如何将子实体附加到用户模型。Laravel嵌套模型。用户模型的子实体?

可以说我有两张表:用户和国籍。这种关系是多对一的(用户:国籍),意味着每个用户只有一个国籍。比方说,用户表有一个叫做“国籍”的行,它简单地将用户映射到国籍表中的国籍。

可以说,我通过香草用户模型的视图 $aUser = User::find(1);

{{$aUser->nationality}}将显示2

而不是示出了ID,我希望用户对象以包括国籍对象。例如,我想{{$aUser->nationality}}输出Australia,而不是与澳大利亚相关的ID。

回答

2

使用with方法

$user= User::with('nationality')->find($id); 

打印$用户看到你的数据。 (而不是$id使用1作为用户ID在你的情况)

注:必须有关系的user.php的作为

public function nationality(){ 
//......... 
//hasOne, belongsTo etc based on your relation 
} 
+1

该代码是不正确的通过ID选择用户的情况下,即只独特:'$用户=用户::其中(阵列( 'ID'=> $ ID)) - > with('nationality') - > get();' - 将返回一个对象的数组。所以将' - > get()'改为' - > first()'使其返回一个对象(不是数组中的对象)。第二个时刻是ORM缩写:'find($ id)',所以不要害怕使用它:'User :: with('nationality') - > find($ id)' – num8er

+1

这现在好吗? @ num8er – webDev

+1

正好。很好(: – num8er

2

让我们说,你已经模型国籍:

class Nationality extends Illuminate\Database\Eloquent\Model 
{ 
    // other stuff 

    // relation between Nationality (id) <-> User (nationality_id) 
    public function users() 
    { 
     return $this->hasMany(User::class); 
    } 

    // some other stuff 
} 

请记住,以满足这个约定:

1)您的nationalities表必须有idname领域

2)你users表必须有nationality_id

和用户模式将是这样的:

class User extends Illuminate\Database\Eloquent\Model 
{ 
    // other stuff 

    // relation between User (nationality_id) <-> Nationality (id) 
    public function nationality() 
    { 
    return $this->belongsTo(Nationality::class); 
    } 

    // some other stuff 
} 

现在,让我们问ORM与相关的东西给数据:

$User = User::with(['nationality'])->find(1); 

的观点:

{{ ($User->nationality)? $User->nationality->name : '' }} 

奖金:

// we made Nationality model to return us all users that has nationality: Australia 
$Nationality = Nationality::with(['users']) 
          ->where(['name' => 'Australia']) 
          ->first(); 
$users = $Nationality->users; 

// or 
$Nationality = Nationality::with(['users'])->find($nationalityId); 
$users = $Nationality->users; 

// and of course eager loading is not good when Your users table is huge, 
// so better do it simply like this: 
$users = User::where('nationality_id', '=', $nationalityId)->paginate(20);