如何在Laravel ORM查询中在没有字段名称的地方写

时间:2018-07-03 15:27:24

标签: laravel orm eloquent

给定的sql查询工作正常(更新:请检查完整查询)。

SELECT * FROM items where (
    select if((select count(*) from item_offers where (some_id_field = items.id or other_id_field = items.id) <= 0, true, false)
); 

完整查询:

SELECT * FROM items where (
    select if(
        (select count(*) from item_offers where (item_offers.listed_item_id = items.id or item_offers.offer_item_id = items.id) and (item_offers.accepted_at is not null and item_offers.cancelled_at is null))<= 0
    , true, false)
);

条件是,在第二个表上,如果我发现正(一个或多个)行数,而我在其中找到了项ID,那么我就不应从项表中返回结果。

我想在laravel查询中写这样的东西:

Item::where(condition is true)->get()

我尝试使用where,whereRaw和我可以在文档中找到的所有可能的组合。有没有办法写没有字段名的地方。

结论:

  

请检查@M Khalid Junaid的第二个答案。这是公认的答案。

2 个答案:

答案 0 :(得分:1)

使用雄辩的关系,您可以轻松获得item_offers中没有相关记录的项目

class Item extends Model{

    public function item_offers()
    {
        return $this->hasMany('App\ItemOffers', 'some_id_field','id');
    }
}

在查询构建器中,您可以编写

$items = Item::doesntHave('item_offers')->get();

用于更新的查询

  

选择* FROM项目,其中(       选择if((从item_offers中选择count(*),其中(some_id_field = items.id或other_id_field = items.id)<= 0,true,false)   );

您可以像

一样用左连接重写它
select i.*
from items 
left join item_offers io on (io.some_id_field = i.id or io.other_id_field = i.id)
where io.id is null

使用查询生成器,您可以将其编写为

DB::table('items as i')
    ->leftJoin('item_offers as io', function ($join) {
        $join->on('io.some_id_field', '=', 'i.id')
             ->orWhere('io.other_id_field', '=', 'i.id');
    })
   ->whereNull('io.id')
   ->get()

答案 1 :(得分:1)

有关更新的问题,将其作为新答案发布

商品提供表与使用2个属性listed_item_idoffer_item_id的商品相关,在商品模型中,您可以将这些关联定义为

class Item extends Model{

    public function listed_offers()
    {
        return $this->hasMany('App\ItemOffers', 'listed_item_id','id');
    }

    public function item_offers()
    {
        return $this->hasMany('App\ItemOffers', 'offer_item_id','id');
    }
}

要检查是否存在这些关系,可以将其写为

$items = Item::doesntHave('listed_offers')->doesntHave('item_offers')->get();