Laravel 雄辩 - 加入表时防止覆盖值
Posted
技术标签:
【中文标题】Laravel 雄辩 - 加入表时防止覆盖值【英文标题】:Laravel eloquent - prevent overriding values when joining tables 【发布时间】:2014-07-23 23:22:38 【问题描述】:好的,所以我有以下两个模型:Account
和 Role
class Account extends Eloquent
protected $table = 'account';
/* [...] */
public function group()
return $this->belongsTo('Group');
和
class Role extends Eloquent
protected $table = 'role';
public function accounts()
return $this->hasMany('Account');
和数据库表:account
和 role
account
-------
id
name
role_id (nullable)
role
----
id
name
现在的事情是:
我需要通过role.name
列订购accounts
。但是在加入(或 leftJoin)之后,值会被第二个表中的值覆盖。这是一些代码:
$response = Account::with('role')->leftJoin('group', 'group.id', '=', 'account.group_id')->get();
之后 id
和 name
的值在 eloquent 集合中不正确。
另外,我需要返回是 eloquent 类型的模型,因为我正在返回 JSON 中的响应,重要的是稍后在 JS 中(解析 JSON 之后)我可以只做 account.role.name
。
更改表中字段的名称(例如:id -> account_id 和:id -> role_id)是一种解决方法,但我的情况并非如此 - 需要为每个表指定名为 id
的主键。
[编辑] 是的,所以问题很简单:如何解决这个问题?
【问题讨论】:
【参考方案1】:如果要选择所有字段并避免覆盖特定表,请将其添加为最后一个选择表
->select('group.*', 'account.*')
.
$response = Account::with('role')
->select('group.*', 'account.*')
->leftJoin('group', 'group.id', '=', 'account.group_id')
->get();
【讨论】:
【参考方案2】:补充 @beech 给出的答案,您可以在 select 子句中使用别名,这样您就可以只获取您需要的特定键,例如
Account::with('role')
->select('account.id AS account_id', 'role.id AS role_id', 'account.name AS account_name', 'role.name AS role_name')
->leftJoin('group', 'group.id', '=', 'account.group_id')
->get();
【讨论】:
【参考方案3】:您可以像在普通 SQL 查询中一样使用“选择”:
$response = Account::with('role')
->select('account.*')
->leftJoin('group', 'group.id', '=', 'account.group_id')
->get();
http://laravel.com/docs/queries#selects
【讨论】:
好吧,看来所有这些雄辩的魔法都让我感到厌烦了。不管怎样,你让我开心。谢谢,回答已接受:) 这拯救了我的一天!以上是关于Laravel 雄辩 - 加入表时防止覆盖值的主要内容,如果未能解决你的问题,请参考以下文章
Laravel orderby 加入 2 个没有雄辩关系的表
Laravel 雄辩用 whereHas 或其他限制 withCount