Laravel - Eloquent 连接

Posted

技术标签:

【中文标题】Laravel - Eloquent 连接【英文标题】:Laravel - Eloquent Joins 【发布时间】:2014-10-18 22:46:54 【问题描述】:

我刚刚开始学习 laravel 及其 orm 系统,Eloquent。我不确定如何正确连接表格。我有 3 个模型:用户、帐户、帐户类型,但我不知道如何使用帐户类型加入帐户。

账户模型类:

public function accounttype()
    return $this->hasOne('AccountType');
 

这是传递帐户信息以供查看:

$accounts = User::find(Auth::user()->id)->accounts;
$accounts->load('accounttype');
return View::make('accounts.accounts')->with('accounts', $accounts);

这将给出以下错误:

SQLSTATE[42S22]:未找到列:1054 'where 子句'中的未知列'accounttypes.account_id'(SQL:select * from accounttypes where accounttypes.account_id in (1, 2, 3) )

它应该是通过 accounttypes 表中的 id 而不是 account_id 提取的。我可以列出用户帐户就好了,我只是不知道如何将帐户类型表加入帐户表。

数据库表:

用户

身份证 用户名 密码 时间戳(updated_at / created_at)

帐户

身份证 姓名 user_id accounttype_id 时间戳

帐户类型

身份证 姓名

每个用户可以拥有多个帐户,每个帐户都有一个帐户类型。

【问题讨论】:

这取决于您的database,显示每个Models 的数据库表。 您的accountsaccounttype 是如何关联的?user 有多个帐户吗? 每个用户都有一个或多个帐户,每个帐户都有一个类型。 试试belongsTo而不是hasOne 【参考方案1】:

User 模型中:

public function accounts()

    return $this->hasMany('Account');

Account 模型中:

public function user()

    return $this->belongsTo('User');


public function accountType()

    return $this->belongsTo('AccountType', 'accounttype_id', 'id');

AccountType 模型中:

public function accounts()

    return $this->hasMany('Account', 'accounttype_id', 'id');

然后在你的控制器中:

// This will return a user with all accounts ($user->accounts will be collection)
$user = User::with('accounts')->find(Auth::user()->id);

或者:

$user = User::with('accounts.accountType')->find(Auth::user()->id);

// You may pass the $user as well and then loop the $user->accounts in view
return View::make('accounts.accounts')->with('accounts', $user->accounts);

在您的view 中,您可以循环获取所有帐户,例如:

@foreach($accounts as $account)
     $account->name 
     $account->accountType->name 
@endforeach

由于$user->accounts 是一个集合,因此您可以运行loop 或专门使用以下方式获取帐户:

 $accounts->first()->name ; // Get first one's name
 $accounts->get(0)->name ; // Get first one's name
 $accounts->get(1)->name ; // Get second one's name
 $accounts->last()->name ; // Get last one's name

如果你像这样传递$user 而不是$accounts

return View::make('accounts.accounts')->with('user', $user);

然后也改变循环,像这样:

@foreach($user->accounts as $account)
     $account->name 
     $account->accountType->name 
@endforeach

您可以在开始循环之前确定该用户是否在view 中拥有帐户,例如:

@if($user->accounts->count())
    // Loop Here
@endif

【讨论】:

快速提问,应该: $user = User::with('accounts')->find(Auth::user()->id);是 $user = User::with('accounts.accounttype')->find(Auth::user()->id);减少查询次数? 是的,你可以像这样得到accountType

以上是关于Laravel - Eloquent 连接的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 eloquent 在 laravel 中编写多个连接

如何使用 Laravel 4 Eloquent 连接列?

Laravel 4,凌乱的 Eloquent 连接查询

Laravel - 使用 Eloquent 从连接关系模型中选择特定列

使用 Laravel 4 Eloquent 连接列上的列名“”无效?

使用 eloquent laravel 获取连接表数据