Получить и сравнить все объекты одного пользователя

248
17 июня 2017, 14:26

Доброе утро! Помогите пожалуйста решить проблему с которой борюсь уже 3 день.

Есть 4 таблицы — Owner, Cars, Dealer, Reviews

Owner
id | firstname |  lastname  |
---|-----------|------------|
1  |   Jonny   |  Lanbergs  |
2  |    Mark   |   Larsen   |
Cars
cid | title | ownerid | type |
----|-------|---------|------|
30  | Name  |    1    |  car |
40  | Name  |    1    |  car |
Dealer
did | title | ownerid |  type |
---|-------|---------|--------|
30 | Name  |    2    | dealer |
50 | Name  |    1    | dealer |
Reviews
id |  review  | itemid  |  type  |
---|----------|-------- |--------|
1  |  Hello   |   30    |   car  |
2  |  Salut   |   30    | dealer |
3  |  Hola    |   40    |   car  |
4  |  Hola    |   50    | dealer |

id - id отзыва/пользователя
cid - id объекта Cars
did - id объекта Dealer
title - название объекта
ownerid - id владельца
review - отзыв
itemid - id объекта для которого написан отзыв
type - тип объекта

В начале необходимо получить все объекты одного пользователя. Далее исходя из полученных данных, получить все отзывы к объектам данного пользователя.

К примеру, нужно получить объекты пользователя Jonny (ID = 1). Вначале делаем запрос к двум таблицам (Cars и Dealer). После выполнения запроса получаем 3 объекта:

— Cars (ID 30)

— Cars (ID 40)

— Dealer (ID 50)

Итого: 30, 40, 50

После делаем запрос к таблице Reviews и выводим все отзывы у которых itemid равняется 30, 40, 50. Но тут возникает проблема. В таблице Reviews, есть еще одно значение itemid - 30 (объект принадлежащий другому пользователю). В итоге мы получим все отзывы, даже принадлежащие объекту другого пользователя Mark (ID = 2).

Каким образом можно сравнить что полученные значения 30, 40, 50, относятся к типам 30 - car, 40 - car, 50 - dealer. Что в данном запросе второй ID 30 не может отображаться т.к. он относится к типу dealer, а полученное текущее значение 30 относится к типу car.

Запрос:

$user = $this->data['userid'];
$reviews = array();
// получаем объекты из Cars
$this->db->select('cid');
$this->db->where('ownerid', $user);
$cget = $this->db->get('cars')->result();
foreach($cget as $c){
    array_push($reviews, $c->cid);
}
// получаем объекты из Dealer
$this->db->select('did');
$this->db->where('ownerid', $user);
$dget = $this->db->get('dealer')->result();
foreach($dget as $d){
    array_push($reviews, $d->did);
}
if(!empty($reviews)){
    foreach($reviews as $id){
        $this->db->or_where('itemid', $id); // сравниваем itemid с полученными объектами
    }
}
$this->db->order_by('id','desc');
return $this->db->get('reviews')->result(); // получаем и выводим результат

Спасибо.

Answer 1

Вначале... после... зачем? всё делается одним запросом.

SELECT r.itemId
     , r.review
     , r.type
     , COALESCE(c.title,d.title) title
     , COALESCE(o1.id,o2.id) oid
     , COALESCE(o1.firstname,o2.firstname) firstname
     , COALESCE(o1.lastname,o2.lastname) lastname
FROM      Reviews r
LEFT JOIN Dealer  d  ON r.itemId  = d.did AND r.type = d.type
LEFT JOIN Owner   o1 ON d.ownerId = o1.id
LEFT JOIN Cars    c  ON r.itemId  = c.cid AND r.type = c.type
LEFT JOIN Owner   o2 ON c.ownerId = o2.id
HAVING oid = 1;
READ ALSO
Добавить товар в корзину кодом woocommerce

Добавить товар в корзину кодом woocommerce

Можно ли при нажатии кастомной кнопки добавить одновременно два и более товаров в корзину (например по id товара), при этом сделать на этот...

282
Приведение decimal к нормальному виду

Приведение decimal к нормальному виду

Храню в БД кол-во биткоинов в decimal(15,15)

286
Как вставить переменную php в тело запроса json

Как вставить переменную php в тело запроса json

Вопрос - как вставить переменную php в тело запроса json?

302
Звездочки в input type=“text”

Звездочки в input type=“text”

Добрый день, как сделать, чтобы в поле input type="text" (не password, именно text) введённые символы заменялись на звездочки, но потом передавать введенное...

588