codescribblr:
私は、特定のクライアントに関連付けられているタスクのリストを取得しようとしているが、タスクとクライアントの間には直接的な関係はありません。私はまた、タスクのステータスとプロジェクトの状況に基づいて、これらのタスクをフィルタリングする必要があります。
ここに私のモデルは以下のとおりです。
class Client extends Model
{
// Fields ['id']
public function projects()
{
return $this->hasMany('App\Project');
}
}
class Project extends Model
{
// Fields ['id', 'client_id', 'status']
public function client()
{
return $this->belongsTo('App\Client');
}
public function tasks()
{
return $this->hasMany('App\Task');
}
}
class Task extends Model
{
// Fields ['id', 'project_id', 'status']
public function project()
{
return $this->belongsTo('App\Project');
}
}
私のコントローラでは、私はに直接アクセスしていClient $client
要求からを。
目標は、顧客が所有するプロジェクトの子供である「オープン」との地位を持っているタスクのリストを返すことです。
基本的に、私はこのような何かを書きたいです。
$client->projects->where('status', 'active')->tasks->where('status', 'open');
そして私は、私はこのクエリから取得したいものを取り戻すしたいです:
SELECT * FROM tasks AS t
WHERE t.status='open'
AND t.project_id IN (
SELECT id FROM projects AS p
WHERE p.status='active'
AND p.client_id=1
);
私はLaravelのクエリビルダを使用してそれを解決することができましたが、私は直接雄弁のORMを使用するソリューションを求めています。
DB::table('tasks')
->join('projects', function($join) use ($client) {
$join->on('projects.id', '=', 'tasks.project_id')
->where('projects.client_id', '=', $client->id);
})->select('tasks.*')->get();
これは一般的な質問に対する変形のようですが、私はここに掲載他の回答でそれを解決することはできませんされてきました。
関連質問:
フェーンデア・トーマス・バン:
あなたが探していることですwhereHas
。それはあなたが「関係の有無に基づいて結果」問い合せることができます。
あなたのような何かを試すことができます:
Task::where('status', 'open')
->whereHas('project', function ($query) use ($client) {
$query->where('client_id', $client->id)
->where('status', 'active');
})
->get();
hasManyThrough
また、このような構造に適用されます。
// In Client.php
public function tasks()
{
return $this->hasManyThrough(Task::class, Project::class);
}
$client->tasks()
->where('projects.status', 'active')
->where('tasks.status', 'open')
->get();
これがうまくいく場合は全くわかりません。