首页 > 解决方案 > Laravel 查询与连接表的关系

问题描述

我有一对一的关系。我的jobs桌子连接到user_jobs桌子。

我加入了这种关系,以获取与工作相关的用户数据。

这是我在Job模型中的关系:

public function client(){
    return $this->hasOne('App\ClientJob')->leftJoin('clients', 'client_jobs.client_id', 'clients.id')
    ->select('clients.id', 'client_id', 'job_id', 'name');
}

这部分代码有效,我得到了客户数据。

但是,我无法在该关系上添加 where 子句(特别是获取的 name 列)。

这是我尝试search users by their name列的代码的一部分:

$jobs = Job::
    when($request->input('keywords'), function($query) use ($request) {
        return $query->where(function ($query) use ($request) {
        $keywords = $request->input('keywords');
            $query->where('title', 'like', '%'.$keywords.'%');
            $query->orWhereHas('client', function ($query) use ($keywords){
                $query->where('name', 'like', '%'.$keywords.'%');
            });
            $query->orWhereHas('category', function ($query) use ($keywords){
                $query->where('name', 'like', '%'.$keywords.'%');
            });
            $query->orWhereHas('status', function ($query) use ($keywords){
                $query->where('name', 'like', '%'.$keywords.'%');
            });
        });
    })

这部分出现“找不到列”错误。

$query->orWhereHas('client', function ($query) use ($keywords){
                $query->where('name', 'like', '%'.$keywords.'%');
            });

除了删除模型内部的连接并将其移动到 where 子句上方的查询中之外,任何人都知道如何启动并运行此查询?

编辑

这是我的整个查询:

$jobs = Job::
    when($request->input('keywords'), function($query) use ($request) {
        return $query->where(function ($query) use ($request) {
        $keywords = $request->input('keywords');
            $query->where('title', 'like', '%'.$keywords.'%');
            $query->orWhereHas('client', function ($query) use ($keywords){
                $query->where('name', 'like', '%'.$keywords.'%');
            });
            $query->orWhereHas('category', function ($query) use ($keywords){
                $query->where('name', 'like', '%'.$keywords.'%');
            });
            $query->orWhereHas('status', function ($query) use ($keywords){
                $query->where('name', 'like', '%'.$keywords.'%');
            });
        });
    })
    ->with(['client','category' => function($query){
        $query->select('id', 'name');
    },'status' => function($query){
        $query->select('id', 'name', 'color');
    }])
    ->when($request->input('sort_by'), function($query) use ($request) {
        if($request->sort_by == 'desc'){
            $query->orderBy('created_at', 'desc');
        }else{
            $query->orderBy('created_at', 'asc');
        }
    })
    ->paginate(15);

标签: phplaravellaravel-5relationshipone-to-one

解决方案


在我看来,错误在于建立关系的形式。与 Eloquent 和 Query builder 的关系之间的区别

public function client(){ return $this->hasOne('App\ClientJob', 'client_id', 'id')->select('client_id', 'job_id', 'name'); }


推荐阅读