php - 当两个表具有相同的列名时,连接关系表后对模型进行排序

标签 php mysql laravel eloquent

我正在 Laravel 上构建一个应用程序,其中有 ProjectLatestStatus 模型,我有一个表,其中包含分拣设施。所以我可以按名称、最新状态、最后更新时间等进行排序。所以这个架构是:

projects
    id
    name -> string
    state -> string
    region -> string
    status -> enum ('saved', 'draft')
    created_at -> timestamp
    updated_at -> timestamp

project_latest_status
    id
    project_id -> integer   // (project id foreign key)
    status -> string       //  (current status of project)

我想通过加入 latest_status 表对项目进行排序,并根据项目的当前状态进行排序。为此我尝试了这样的事情:

Project::where('status', 'saved')
    ->when( $request->name , function( $q) use( $request ) {
        $q->where('name', 'like', '%' . $request->name .'%');
    }) 
    ->when($request->status, function ($q) use($request) {
        $q->whereHas('latestStatus', function ($q) use($request){
            $q->whereHas('status', function ($q) use($request) {
                $q->whereIn('name',  collect($request->status)->pluck('name') );
            });
        });
    })
    ->when($request->sort_by_column, function ($q) use($request) {
        $q->when($request->sort_by_column['column'] == 'name' || $request->sort_by_column['column'] == 'website', function ($q) use($request) {
            $q->orderBy($request->sort_by_column['column'], $request->sort_by_column['order'] );
        })
        ->when($request->sort_by_column['column'] == 'added_date' , function ($q) use ($request) {
            $q->orderBy('created_at', $request->sort_by_column['order']);
        })
        ->when($request->sort_by_column['column'] == 'status', function ($q) use ($request) {
            $q->join('project_latest_status', 'projects.id', '=', 'project_latest_status.project_id')
                ->join('project_status', 'project_latest_status.status', '=', 'project_status.id')
                ->select('projects.*', 'project_status.name as status_name')
                ->orderBy('status_name', $request->sort_by_column['order']);
        })
    })->get();

一切正常,但一旦我单击状态排序,就会出现错误:

SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'status' in where clause is ambiguous (SQL: select count(*) as aggregate from projects inner join project_latest_status on projects.id = project_latest_status.project_id inner join project_status on project_latest_status.status = project_status.id where status = saved and projects.deleted_at is null)"

帮我解决这个问题。谢谢

最佳答案

更改来源

where('status', 'saved')

where('projects.status', 'saved')

或者在任何地方将 status 与另一个连接表另一个相同的字段一起使用,因此您需要指定要按 status 过滤的表

关于php - 当两个表具有相同的列名时,连接关系表后对模型进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58889900/

相关文章:

php - 来自数据库的错误值

laravel - 我如何对 vue 组件外的表使用过滤器?

php - 实体中的 Doctrine isDeletable 方法

php - imagesx() 期望参数 1 为资源, bool 值给定

java发送json到php并插入mysql,但返回null

sql - 根据交易数据计算当前成员(member)余额

php - 我想在一个mysql查询中获得第n级的类别和子类别的层次结构

php - 如何读取此 xml,获取 "parser error : CData section not finished"

mysql - 自动填充mysql表中的其他列

mysql - Laravel 按关系属性订购数据