Доброе утро! Помогите пожалуйста решить проблему с которой борюсь уже 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(); // получаем и выводим результат
Спасибо.
Вначале... после... зачем? всё делается одним запросом.
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;
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Можно ли при нажатии кастомной кнопки добавить одновременно два и более товаров в корзину (например по id товара), при этом сделать на этот...
Вопрос - как вставить переменную php в тело запроса json?
Добрый день, как сделать, чтобы в поле input type="text" (не password, именно text) введённые символы заменялись на звездочки, но потом передавать введенное...