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
,显示每个Model
s 的数据库表。
您的accounts
和accounttype
是如何关联的?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 - 使用 Eloquent 从连接关系模型中选择特定列