结合这两个查询并返回最匹配的查询

时间:2020-04-04 07:52:39

标签: php laravel eloquent model

我有 $ table ,其中'is_contain'字段为1或0。我有几条Obj记录,其中包含'active'和'is_contain'字段。

第一种情况:

$ table-> is_contain = 1

可用的Obj记录:

  • 'id'= 1'active'= 1和'is_contain'= 0
  • 'id'= 2'活动'= 1和'is_contain'= 1

应返回id = 2的Obj记录

第二种情况:

$ table-> is_contain = 1

可用的Obj记录:

  • 'id'= 1'活动'= 1和'is_contain'= 0

应返回id = 1的Obj记录

如果 $ table-> is_contain = 1 并具有'is_contain'= 1的Obj记录,则返回此特定的'is_contain'= 1的Obj记录,否则返回'is_contain'= 0的记录

起初,我使用-> get()而不是-> first(),但是-> get()将返回所有两个Obj记录,这不是我想要的,因为我必须遍历这两个记录并获取带有“ is_contain” = 1的那个。

$obj=Obj::whereActive(1)->where(function($query)use($table){
    if($table->is_contain){
        $query->where('is_contain',1)->orWhere('is_contain',0);
    }
})
->get();

现在我分成两部分,因为如果使用-> first(),它将始终返回第一个集合,有时像此示例一样,Obj记录的“ is_contain”字段不是1。

$obj=Obj::whereActive(1)->where(function($query)use($table){
    if($table->is_contain){
        $query->where('is_contain',1);
    }
})
->first();

if($obj==null&&$table->is_contain){
    $obj=Obj::whereActive(1)->first();
}

有什么办法可以将这两个查询合并为一个?

1 个答案:

答案 0 :(得分:1)

只需按照is_contain字段的顺序进行排序,然后排第一行:

$obj = Obj::whereActive(1);
if ($table->is_contain) {
    $obj = $obj->orderBy('is_contain', 'DESC')->first();
}