Eloquent Where In With 连接子查询
Eloquent Where In With Join Subquery
我正在尝试在 Laravel 5.4 中使用 Eloquent 执行此查询,但我没有让子查询正常运行。这是原始的 SQL 查询:
select * from projects p
inner join projects_categories pc on p.id = pc.project_id
where pc.name in (select pc.name from projects p
inner join projects_categories pc on p.id = pc.project_id
where p.id = $project->id) and p.id <> $project->id;
这就是我想要做的:
Project::join('projects_categories', 'projects.id', '=', 'projects_categories.project_id')
->whereIn([
['projects_categories.name', function ($query) {
$query->select('projects_categories.name')
->from('projects')
->join('projects_categories', 'projects.id', '=', 'projects_categories.project_id')
->where('project.id', '=', $project->id);
}],
['projects.id', '<>', $project->id]
])
->get();
但我总是得到错误:
Illuminate\Database\Query\Builder::whereIn() 缺少参数 2。
谁能帮我解决这个问题?非常感谢您的时间和帮助。
试试这个:
Project::join('projects_categories', 'projects.id', '=', 'projects_categories.project_id')
->whereIn('projects_categories.name', function($query) use($project) {
$query->select('projects_categories.name')->from('projects')
->join('projects_categories', 'projects.id', '=', 'projects_categories.project_id')
->where('projects.id', '=', $project->id);
})->where('projects.id', '<>', $project->id)->get();
如果在 Project.php
中,您与 categories
有 hasMany
关系,即
public function categories()
{
return $this->hasMany(Category::class);
}
那么你应该可以return这样雄辩地表达关系:
Project::find($id)->with('categories');
或者如果您已经加载了项目对象
$project->load('categories');
我会查看 Laravel 文档,因为您发布的连接看起来过于复杂!
我正在尝试在 Laravel 5.4 中使用 Eloquent 执行此查询,但我没有让子查询正常运行。这是原始的 SQL 查询:
select * from projects p
inner join projects_categories pc on p.id = pc.project_id
where pc.name in (select pc.name from projects p
inner join projects_categories pc on p.id = pc.project_id
where p.id = $project->id) and p.id <> $project->id;
这就是我想要做的:
Project::join('projects_categories', 'projects.id', '=', 'projects_categories.project_id')
->whereIn([
['projects_categories.name', function ($query) {
$query->select('projects_categories.name')
->from('projects')
->join('projects_categories', 'projects.id', '=', 'projects_categories.project_id')
->where('project.id', '=', $project->id);
}],
['projects.id', '<>', $project->id]
])
->get();
但我总是得到错误:
Illuminate\Database\Query\Builder::whereIn() 缺少参数 2。
谁能帮我解决这个问题?非常感谢您的时间和帮助。
试试这个:
Project::join('projects_categories', 'projects.id', '=', 'projects_categories.project_id')
->whereIn('projects_categories.name', function($query) use($project) {
$query->select('projects_categories.name')->from('projects')
->join('projects_categories', 'projects.id', '=', 'projects_categories.project_id')
->where('projects.id', '=', $project->id);
})->where('projects.id', '<>', $project->id)->get();
如果在 Project.php
中,您与 categories
有 hasMany
关系,即
public function categories()
{
return $this->hasMany(Category::class);
}
那么你应该可以return这样雄辩地表达关系:
Project::find($id)->with('categories');
或者如果您已经加载了项目对象
$project->load('categories');
我会查看 Laravel 文档,因为您发布的连接看起来过于复杂!