Как написать, где без имени поля в запросе ORM laravel

Данный запрос 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.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
1
0
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Используя красноречивые отношения, вы можете легко получить элементы, в которых нет связанных записей в 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 в вопросе. между таблицами нет ограничения внешнего ключа

Tomonso Ejang 03.07.2018 17:46

@M Халид Джунаи. можно ли написать красноречивый запрос в sql-запросе без использования соединения.

Tomonso Ejang 04.07.2018 07:14

@TomonsoEjang Eloquent работает с отношениями, как вы сказали, между вашими таблицами нет связи, тогда как вы ожидаете, что это будет работать

M Khalid Junaid 04.07.2018 07:31

@M Халид Джунаид. Есть ли способ реализовать это в laravel. я обновляю полный запрос.

Tomonso Ejang 04.07.2018 07:34

@TomonsoEjang Да, можно обойтись, если вы можете подтвердить, что some_id_field и other_id_field связаны с вашей таблицей элементов?

M Khalid Junaid 04.07.2018 07:37

Позвольте нам продолжить обсуждение в чате.

Tomonso Ejang 04.07.2018 07:43

Для обновленного вопроса разместите его как новый ответ

Таблица предложений товаров относится к товарам, использующим 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();

Другие вопросы по теме