如何在使用laravel elventual时得到所有同名的列?

np8igboo  于 2022-12-30  发布在  其他
关注(0)|答案(2)|浏览(107)

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

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和join

$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多个字段上这样做是很痛苦的。这是一个导出函数,所以所有字段都是必需的。有没有一种方法可以进行必要的重命名,而不列出所有其他不需要重命名的字段来检索所有行?或者有没有一种方法可以检索所有行而不需要重命名?
pidoss.我正在使用laravel 4.这是一个老项目,更新甚至比列出所有字段更痛苦。

hlswsv35

hlswsv351#

遗憾的是,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记录。

yvt65v4c

yvt65v4c2#

// duplicates

    $products = Product::orderBy('name')->get();
    $ids = collect();

    foreach ($products as $product) {
        $count = Product::where('name', $product->name)->count();
        if($count > 1) {
            $ids->add($product->id);
        }
    }

    $duplicates = Product::whereIn('id', $ids)->orderBy('name')->orderBy('id')->get();

相关问题