Данный запрос 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)
);
Условие состоит в том, что во второй таблице, если я нахожу положительное (одно или несколько) количество строк, где я нахожу идентификатор элемента, то я не должен возвращать результат из таблицы элементов.
я хочу написать что-то подобное в запросе laravel:
Item::where(condition is true)->get()
Я пробовал использовать where, whereRaw и все возможные комбинации, которые я мог найти в документации. есть ли способ написать где без имени поля.
заключение :
please check the second answer by @M Khalid Junaid. which is the accepted answer.






Используя красноречивые отношения, вы можете легко получить элементы, в которых нет связанных записей в 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();
Для обновленного запроса
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 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()
@M Халид Джунаи. можно ли написать красноречивый запрос в sql-запросе без использования соединения.
@TomonsoEjang Eloquent работает с отношениями, как вы сказали, между вашими таблицами нет связи, тогда как вы ожидаете, что это будет работать
@M Халид Джунаид. Есть ли способ реализовать это в laravel. я обновляю полный запрос.
@TomonsoEjang Да, можно обойтись, если вы можете подтвердить, что some_id_field и other_id_field связаны с вашей таблицей элементов?
Позвольте нам продолжить обсуждение в чате.
Для обновленного вопроса разместите его как новый ответ
Таблица предложений товаров относится к товарам, использующим 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();
@M Халид Джунаид. не могли бы вы ответить на обновленный запрос sql в вопросе. между таблицами нет ограничения внешнего ключа