Получить последнюю запись

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
jakiro
Сообщения: 553
Зарегистрирован: 2013.03.05, 15:15

Получить последнюю запись

Сообщение jakiro »

Доброго времени:
Необходимо получить 1 запись по связи:
Есть темы, у них много сообщений.
Сообщение пренадлежит теме.

Код: Выделить всё

class Fmessages extends CActiveRecord
{

  public function relations()
  {
    return array(
      'topic' => array(self::BELONGS_TO, 'FTopics', 'topic_id'),
    );
  }

  public static function model($className=__CLASS__)
  {
      return parent::model($className);
  }
}
 

Код: Выделить всё

class Ftopics extends CActiveRecord
{

  public function relations()
  {
    return array(
      'messages' => array(self::HAS_MANY, 'Fmessages', 'topic_id'),
    );
  }

  public static function model($className=__CLASS__)
  {
      return parent::model($className);
  }
}
 
У Fmessages есть поле с датой (date_add).
Получаю все темы:

Код: Выделить всё

$rows = Ftopics::model()->findAll(); 
Задача получить у каждой Ftopics последний date_add (поле принадлежит Fmessages ) аля (order by date_add DESC LIMIT 1)
jakiro
Сообщения: 553
Зарегистрирован: 2013.03.05, 15:15

Re: Получить последнюю запись

Сообщение jakiro »

Я могу конечно в каждом ряде Ftopics сделать выборку всех комментариев, перевернуть все это дело по дате (убывание) и забрать первую запись. Но это не правильно как то, надо как то сделать одним запросом ;)
badjo
Сообщения: 188
Зарегистрирован: 2013.10.10, 12:39

Re: Получить последнюю запись

Сообщение badjo »

Что-то типа такого.

Код: Выделить всё

$criteria = new CDbCriteria;
$criteria->join = 'LEFT JOIN Fmessages ON Fmessages.topic_id =
(SELECT topic_id FROM Fmessages WHERE Fmessages.topic_id=FTopics.topic_id ORDER BY Fmessages.date_add DESC LIMIT 1)';
$rows = Ftopics::model()->findAll($criteria); 
drax08
Сообщения: 16
Зарегистрирован: 2013.10.22, 18:53

Re: Получить последнюю запись

Сообщение drax08 »

Может лучше вот так:

Код: Выделить всё

class Ftopics extends CActiveRecord
{

  public function relations()
  {
    return array(
      'messages' => array(self::HAS_MANY, 'Fmessages', 'topic_id'),
      'last_date_add' => array(self::STAT, 'Fmessages', 'topic_id', 'select' => 'MAX(date_add)'),
    );
  }

  public static function model($className=__CLASS__)
  {
      return parent::model($className);
  }
}
jakiro
Сообщения: 553
Зарегистрирован: 2013.03.05, 15:15

Re: Получить последнюю запись

Сообщение jakiro »

drax08 писал(а):Может лучше вот так:

Код: Выделить всё

class Ftopics extends CActiveRecord
{

  public function relations()
  {
    return array(
      'messages' => array(self::HAS_MANY, 'Fmessages', 'topic_id'),
      'last_date_add' => array(self::STAT, 'Fmessages', 'topic_id', 'select' => 'MAX(date_add)'),
    );
  }

  public static function model($className=__CLASS__)
  {
      return parent::model($className);
  }
} 
Да, то что нужно. Спасибо. Надо по подробнее с этим типом связи разобраться.
Ответить