gpt4 book ai didi

php - 基于多对多关系与同一列上的多个条件进行搜索

转载 作者:行者123 更新时间:2023-11-28 23:21:47 25 4
gpt4 key购买 nike

我的 laravel 5.3 项目有一个多对多关系。有两个模型与此问题相关。它们是JobTag。模型 Job 可以有许多与之关联的 Tag 并且模型 Tag 与许多 Job 相关。我在两个模型类中都使用关键字“belongsToMany”分配了关系多对多。关系的数据库是:表:工作

________________
id | title |
____|___________|
1 | Developer|
____|___________|
2 | Designer |
____|___________|
3 | Tester |
____|___________|
4 | manager |
____|___________|

表格:标签

_________________
id | tag_name |
____|___________|
1 | php |
____|___________|
2 | html |
____|___________|
3 | css |
____|___________|

数据透视表:job_tag

_____________________
job_id | tag_id |
________|___________|
1 | 1 |
________|___________|
1 | 2 |
________|___________|
2 | 1 |
________|___________|
3 | 1 |
________|___________|
3 | 2 |
________|___________|
4 | 2 |
________|___________|

用户可以传递多个标签名称来检索与用户传递的两个标签相关的职位。(AND条件)

示例:当用户传递 tag_name“php”和“html”时,我想显示工作的详细信息 [id:1 title:developer] 和 [id:2 title:designer ].

提示:检索同时具有“php”和“html”标签的作业记录

注意:用户传递的标签名称的数量没有定义,即用户可以传递多少。


这是我尝试过的:

$jobs = Job::whereHas('tags', function ($query) use($params) {
foreach ($params['tags'] as $tag) {
$query->where('tag', $tag);
}
});

上面的代码没有返回任何东西,但是生成了下面的 sql:

select * from `jobs` where exists (select * from `tags` inner join `job_tag` on `tags`.`id` = `job_tag`.`tag_id` where `job_tag`.`job_id` = `jobs`.`id` and (`tag` = css) and (`tag` = javascript))

我试图根据这个 sql 获取结果,但它不起作用。

希望你们理解我的问题并帮助我找到解决方案。提前致谢。

最佳答案

一种选择是使用多个 whereHas 作为:

$query = Job::query();

foreach ($params['tags'] as $tag) {
$query->whereHas('tags', function ($q) use($tag) {
$q->where('tag', $tag);
});
}

$jobs = $query->get();

假设您有一个标签 id 数组:

$tag_ids = [2, 4];

那么你可以试试:

Job::whereHas('tags', function($q) use($tag_ids) {
$q->whereIn('tag_id', $tag_ids)
->groupBy('job_id')
->havingRaw('COUNT(DISTINCT tag_id) = '.count($tag_ids));
})->get();

关于php - 基于多对多关系与同一列上的多个条件进行搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41283817/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com