首页 > 解决方案 > 在 Laravel (Eloquent) 中为子查询/连接查询自动插入表名

问题描述

这是我的查询:

PHP
public function find(array $filter = []) : Collection
{
return $this->entity::where($filter)->join('cases_has_services', function ($join) {

        $join->on('cases_has_services.cases_id', 'checklists.cases_id');
        $join->on('cases_has_services.services_id', 'checklists.item_id');

    })->select('checklists.*', 'cases_has_services.quantity')->get();

}

我收到下一个错误:

SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'id' in where 
clause is ambiguous (SQL: select `checklists`.*, 
`cases_has_services`.`quantity` from `checklists` inner join 
`cases_has_services` on `cases_has_services`.`cases_id` = 
`checklists`.`cases_id` and `cases_has_services`.`services_id` = 
`checklists`.`item_id` where (`id` = 352))

所以我稍微修正了我的代码:

public function find(array $filter = []) : Collection
{

    // TODO fix this
    foreach ($filter as $field => $value) {

        unset($filter[$field]);

        $field = 'checklists.' . $field;

        $filter[$field] = $value;

    }

    return $this->entity::where($filter)->join('cases_has_services', function ($join) {

        $join->on('cases_has_services.cases_id', 'checklists.cases_id');
        $join->on('cases_has_services.services_id', 'checklists.item_id');

    })->select('checklists.*', 'cases_has_services.quantity')->get();

}

但我认为这不是一个好习惯。那么,是否有任何原生 laravel 路径可以在使用连接的查询中自动插入表名?我的意思是,如何避免使用这部分代码,因为它有点 hacky:

    foreach ($filter as $field => $value) {

        unset($filter[$field]);

        $field = 'checklists.' . $field;

        $filter[$field] = $value;

    }

标签: laraveleloquent

解决方案


将您的 $filter 变量更改为:

$filter = ['checklists.id' => 123]


推荐阅读