【问题标题】:How to get all column with some having same name when using laravel eloquent?使用laravel eloquent时如何获取所有具有相同名称的列?
【发布时间】:2017-01-14 15:02:25
【问题描述】:

假设我有 2 个表,列如下:

table_a: (with a corresponding model TableA)
id | (20+ other field) | deleted_at | created_at | updated_at

table_b: (with a corresponding model TableB)
id | a_id | ( 30+ other field ) | deleted_at | created_at | updated_at

现在我正在使用 laravel 并加入这两个表

$result = TableA::join('table_b', 'table_a.id', '=', 'table_b.a_id')
    ->where('table_b.created_at', '>=', date('Y-m-d'))
    ->get();

问题是当列名与 table_a 相同时,我无法访问 table_b 的某些字段。 (即iddeleted_atcreated_atupdated_at

我做了一些搜索,从this question on stackoverflow,我可能会这样做:

$result = TableA::join('table_b', 'table_a.id', '=', 'table_b.a_id')
    ->where('table_b.created_at', '>=', date('Y-m-d'))
    ->select('table_b.id as b_id', 'table_b.created_at as b_created_at')
    ->get();

但是,当使用这种方法时,我需要将所有列名添加到select语句中,而且在50多个字段上这样做很痛苦。它是一个导出功能,因此所有字段都是必需的。有没有一种方法可以在不列出所有其他不需要重命名来检索所有行的字段的情况下进行必要的重命名?或者有没有一种方法可以在不重命名的情况下检索所有行?

附:我用的是laravel 4。这是一个老项目,更新比列出所有字段还要痛苦。

【问题讨论】:

  • 您必须至少重命名其中一个。您可以为其中一个表(具有更多字段的表)选择所有表并重命名另一个表:例如 'table_a.*'、'table_b.id as b_id'、'table_b.created_at as b_created_at'

标签: php laravel laravel-4 laravel-5 eloquent


【解决方案1】:

不幸的是,Eloquent 查询不会为连接表中的字段设置别名,因此具有相同名称的列会相互覆盖。

显而易见的解决方案是重命名列,但这并不总是可行的选择。

另一个解决方案是摆脱连接并使用查询构建器的 whereHas 方法,该方法允许根据相关模型中的数据过滤数据。由于它使用子选择而不是连接,因此不会覆盖任何列。

您需要做的就是在您的 TableA 模型中定义一个关系 table_b

class TableA extends Model {
  public function table_b() {
    return $this->hasOne(TableB::class); //or hasMany, depending on your data model
  }
}

和替换:

$result = TableA::join('table_b', 'table_a.id', '=', 'table_b.a_id')
  ->where('table_b.created_at', '>=', date('Y-m-d'))
  ->get();

$result = TableA::whereHas('table_b', function($query) {
  $query->where('created_at', '>=', date('Y-m-d');
});

这将为您提供具有与给定条件匹配的相关 TableB 记录的所有 TableA 记录。

【讨论】:

  • 如果我想要 TableA 和 TableB 中的两个字段怎么办?这是一个导出功能,需要双方的数据。
  • 您可以通过添加对 ->with('table_b') 的调用来急切地加载相关记录,然后通过 $tableARecord->table_b 获得这些数据
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-03
  • 1970-01-01
  • 2019-11-11
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多