【问题标题】:Laravel query on relationship with joined tableLaravel 查询与连接表的关系
【发布时间】:2019-05-08 05:05:28
【问题描述】:

我有一对一的关系。我的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 子句(特别是获取的名称列)。

这是我的代码中尝试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);

【问题讨论】:

  • 试试client.name
  • 不幸的是,client.name 或 clients.name 都不起作用。
  • 试试 Job::with('client')
  • 去掉paginate()方法,这样你就得到了一个未执行的Query对象。然后在上面做一个->toSql() 和一个->getBindings()。这将向您展示 SQL QueryBuilder 将尝试执行的内容。如果问题的根源不明显,请发布结果,以便我们进一步剖析。
  • 您确定他们未找到的列来自客户关系吗?

标签: php laravel laravel-5 relationship one-to-one


【解决方案1】:

我无法评论,声誉太少,所以写在这里。 也许像这样在 whereHas() 中包含 ClientJob 关系

orWhereHas('client.clientJob', function (...

【讨论】:

    【解决方案2】:

    在我看来,错误在于建立关系的形式。与关系的区别 Eloquent 和查询构建器

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

    【讨论】:

      猜你喜欢
      • 2021-12-10
      • 1970-01-01
      • 1970-01-01
      • 2015-03-10
      • 2021-09-05
      • 1970-01-01
      • 2019-02-08
      • 2021-05-25
      • 2022-12-03
      相关资源
      最近更新 更多