Yii1 MYSQL присоединяется к 4 таблицам в where class и group

#php #mysql #yii

#php #mysql #yii

Вопрос:

Я новичок в YII1 и хочу запросить одну базу данных

У меня есть база данных для доставки товаров клиентам. для этого у меня есть 4 таблицы,

 delivery_logs 
delivery
driver
customer
  

(у нас есть таблица журнала доставки, потому что некоторое время в одной доставке было много записей, таких как «не доставлено», «другой драйвер принимает доставку» и т.д.)

 delivery_log

id delivery_id driver_id  message     date_added
1  1           1         OK         2016-09-13 17:38:15 
2  2           2         OK         2016-09-13 17:35:18 
3  1           1         Not OK     2016-09-13 17:33:10     
4  1           3         OK         2016-09-13 17:32:13 
5  2           4         waiting    2016-09-13 17:20:11 


delivery
delivery_id  customer_id name          status
1            1           delivery 1    done
2            1           delivery 2    done
3            2           delivery 3    done


driver
driver_id  name
1          driver1
2          driver2
3          driver3

customer
customer_id  first_name   last_name
1            name1          other name1
2            name2          other name2
3            name3          other name3
4            name3          other name4
  

теперь я хочу получить запрос

 last 1 record (order by date_added) from delivery_log 
for each delivery by each driver
  

где доставка = выполнена
и я хочу иметь следующие поля

 delivery_log.delivery_id  delivery_log.driver_id delivery_log.message date_added 
delivery.name driver.name 
customer.first_name customer.last_name
  

Я использую

 $criteria=new CDbCriteria;
  

он работает и получает последнюю запись с помощью приведенного ниже

 $criteria->order = 't.date_added DESC';
  

но когда я помещаю

 $criteria->group = 't.delivery_id,t.driver_id';
$criteria->order = 't.date_added DESC';
  

это не вернуло последнюю запись….

Спасибо за любую помощь.

Ответ №1:

для сложного запроса, связанного с моделью, вы можете использовать findAllBySql, где вы используете плоское продолжение для восстановления нужных вам моделей

 $sql = 'SELECT colA, colB 
        FROM any_table as a
        INNER JOIN inner_join_table as b on  a.key = b.key
        LEFT JOIN  left_join_table as c on a.key = c.key
        WHERE a.col1 = .....'
$model = MyModel::model()->findAllBySql($sql);
  

используя такого рода функции, вы можете, например::

 $sql = 'select 
         delivery_log.delivery_id,
         delivery_log.driver_id,
         delivery_log.message, 
         delivery_log.date_added,
         delivery.name,
         driver.name,
         customer.first_name,
         customer.last_name
         from delivery_log
         inner join delivery on delivery_log.key = delivery.key 
         .... 
         ...'
$model= DeliveryLog::model()->findBySql($sql);