gpt4 book ai didi

php - laravel ORM 关系 : left Join like query with optional condition on the right table

转载 作者:行者123 更新时间:2023-11-29 03:22:49 24 4
gpt4 key购买 nike

我有两个表,tutorial:id,titletutorial_tags:id,tutorial_id,title

tutorial 模型中的关系定义如下:

function TutorialTag(){
return $this->hasMany('App\TutorialTag');
}

我想加入 tutorialstutorial_tags ,比如(请忽略语法错误):

select tutorials.* , tutorial_tags.* from `tutorials` left Join 
`tuotrial_tags` ON tutorials.id = tutorial_tags.tutorial_id

但我希望能够在 tutorial_tags 上使用条件,以防用户想要搜索特定标签:

select tutorials.* , tutorial_tags.* from `tutorials` left Join 
`tuotrial_tags` ON tutorials.id = tutorial_tags.tutorial_id
where tutorial_tags.title = 'ABC'

如果我这样使用 whereHas :

    $tutorials = Tutorial::whereHas('TutorialTag',function ($query){
if(isset($_GET['tag']))
$query->where('title',$_GET['tag']);
})->get();

我没有得到没有任何标签的教程,基本上它像 inner Join 一样工作。

如果我使用 with :

    $tutorials = Tutorial::with(['TutorialTag'=>function($query){
if(isset($_GET['tag']))
$query->where('title',$_GET['tag']);
}])->get();

然后我会得到两个相互没有影响的独立查询,基本上 tutorial_tags 上的 where conditiontutorials 没有影响,我得到所有教程,甚至是没有 sreached 标签的教程,这里是查询日志:

Array
(
[0] => Array
(
[query] => select * from `tutorials`
[bindings] => Array
(
)

[time] => 0
)

[1] => Array
(
[query] => select * from `tutorial_tags` where `tutorial_tags`.`tutorial_id` in (?, ?, ?) and `title` = ?
[bindings] => Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => ABC
)

[time] => 2
)

)

我怎样才能在右表中加入带有可选条件的 Join like query

最佳答案

这不是一个有效的 sql 查询,但您可以使用 laravel collections 解决问题和一个额外的查询。

抓取所有的路口:

$tutorials1 = Tutorial::whereHas('TutorialTag',function ($query){
if(isset($_GET['tag']))
$query->where('title',$_GET['tag']);
})->get();

捕获剩下的:

$tutorials2 = Tutorial::doesntHave('TutorialTag')->get();

合并两个集合:

$tutorials = $tutorials1->merge($tutorials2);

关于php - laravel ORM 关系 : left Join like query with optional condition on the right table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41151844/

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