laravel 雄辩的基于foreign列的with和where子句关系

问题描述 投票:0回答:4

嗨,我想检索保存在数据库中的

projects
,该数据库由身份验证者
user
拥有,该身份验证者还创建
clients
(他们有许多项目和任务)和
tasks
(属于项目和任务和用户) ).

我想检索状态表中未标记为已关闭的所有任务,我知道它的 id 是 2,我可以这样检索:

public function getOpenProjects() {

    return \Project::with(['clients', 'tasks', 'status'])
        ->where('status_id', '!=', '2')
        ->whereUserId(Auth::user()->id)
        ->get();
}

但是我如何更改它以查询状态表中的列,即该表中的名称列?

php laravel eloquent
4个回答
110
投票

你可以试试这个:

$value = 'someName';
Project::with(['clients', 'tasks'])
    // Query the name field in status table
    ->with(['status' => fn($q) $q->where('name', $value)])
    ->where('status_id', '!=', '2')
    ->whereUserId(Auth::user()->id)
    ->get();

你也可以尝试这个(只有当

query
返回你想要的
name
时,它才会获取记录,否则没有):

$value = 'someName';
Project::with(['clients', 'tasks', 'status'])
    // Query the name field in status table
    ->whereHas('status', fn($q) => $q->where('name', $value))
    ->where('status_id', '!=', '2')
    ->whereUserId(Auth::user()->id)
    ->get();

11
投票

你可以试试这个:

Project::with(['clients', 'tasks' => function($q) use($value) {
// Query the name field in status table
    $q->where('status_id', '!=', '2'); 
}])
->whereUserId(Auth::user()->id)
->get();

2
投票

现在,您可以使用 whereRelation

public function getOpenProjects() {

return Project::with(['clients', 'tasks', 'status'])
             ->whereRelation('status', 'name', '!=', '2')        
             ->whereUserId(Auth::user()->id)
             ->get();
}

-3
投票

如果您需要添加条件,您可以这样做

return Query::with(['department' => function ($query) use ($department) {
           $query->when($department, function ($query) use ($department) {
              $query->whereId($department);
           });
        }, 'category' => function($query) use ($category) {
            $query->when($category, function ($query) use ($category) {
              $query->whereId($category);
           });
        }])->when($activeStatus, function ($query) use ($activeStatus) {
              $activeStatus = (request()->active_status === 'active') ? 1 : 0;
              $query->whereActive($activeStatus);
         })->latest()->paginate($dataPerPage);

或者你也可以这样做

return Query::with('department', 'category')
    ->when($department, function($query) use ($department) {
        $query->whereHas('department', function (Builder $query) use ($department) {
            $query->whereId($department);
        });
    })->when($category, function ($query) use ($category) {
        $query->whereHas('category', function (Builder $query) use ($category) {
            $query->whereId($category);
        });
    })->when($activeStatus, function ($query) use ($activeStatus) {
        $activeStatus = (request()->active_status === 'active') ? 1 : 0;
        $query->whereActive($activeStatus);
    })->latest()->paginate($dataPerPage);
© www.soinside.com 2019 - 2024. All rights reserved.