【问题标题】:Laravel eloquent - prevent overriding values when joining tablesLaravel 雄辩 - 加入表时防止覆盖值
【发布时间】: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 的主键。

[编辑] 是的,所以问题很简单:如何解决这个问题?

【问题讨论】:

    标签: php join laravel eloquent


    【解决方案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

        【讨论】:

        • 好吧,看来所有这些雄辩的魔法都让我感到厌烦了。不管怎样,你让我开心。谢谢,回答已接受:)
        • 这拯救了我的一天!
        猜你喜欢
        • 2022-01-19
        • 1970-01-01
        • 2018-10-11
        • 2016-06-27
        • 1970-01-01
        • 2020-07-29
        • 2014-11-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多