给定的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的第二个答案。这是公认的答案。
答案 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_id
和offer_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();