Как написать где без имени поля в запросе ORM laravel - PullRequest
0 голосов
/ 03 июля 2018

Данный 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()

Я пытался использовать где, гдеRaw и все возможные комбинации, которые я мог найти в документации. есть ли способ написать куда без поля name.

вывод:

пожалуйста, проверьте второй ответ @M Khalid Junaid. который является принятым ответом.

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

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

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

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

Для обновленного запроса

ВЫБРАТЬ * ИЗ пунктов, где ( выберите if ((выберите count (*) из item_offers где (some_id_field = items.id или other_id_field = items.id) <= 0, true, false) ); </p>

Вы можете переписать его с левым соединением, как

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...