2013-09-14 4 views
0

Это таблица базы данных у меня есть:Как показывают SQL вычисляемого столбца в CGridView

поездка

  • ID
  • емкость
  • ...

tripRegisteration
  • идентификатор
  • tripId
  • Firstname
  • Lastname
  • телефон
  • ...
  • registerationState

SQL запрос

Я хочу SQL запрос, который даст мне поездки, которые имеют достаточную свободную емкость. TripRegisteration.registerationState для действительной регистрации - approved. это SQL-запрос:

SELECT t.*,count(*) as registeredNum 
FROM trip t 
left join 
    (select * 
      from trip_registeration tr 
      where tr.registerationState="approved" 
      ) trlist 
    on t.id =trlist.tripId 
group by t.id 
having t.capacity>registeredNum 

Yii Код

Это код Yii PHP для получения поставщика данных в DBTrip ActiveRecord модели

public function getAvailableTripsDataProvider() 
{ 
    $criteria = new CDbCriteria(); 
    $criteria->select = 't.*, COUNT(*) AS registeredNum'; 
    $criteria->join = 
    'left join (select * 
    from trip_registeration tr 
    where tr.applicationState="initialized" 
    ) trlist 
    on t.id =trlist.tripId'; 
    $criteria->group = 't.id'; 
    $criteria->having = 't.capacity > registeredNum'; 

    return new CActiveDataProvider ('DBTrip', array (
      'criteria' => $criteria 
    ) 
} 

проблема

Все просто работает штраф, за исключением того, что я не могу получить значение registerednNum в CGridView, 'value' => 'var_dump($data)' просто покажет свойства соответствующих D BTrip Row, и у него нет никакой информации о registeredNum. Как я могу показать его в CGridView?

ответ

0

Вам нужно добавить registeredNum в качестве государственной собственности к вашей DBTrip модели:

class DBTrip extends CActiveRecord{ 
    public $registeredNum; 

Кроме того, я удивляюсь, почему вы делаете это ненужной подвыборка. Вы можете просто добавить это условие к своему предложению ON, что делает ваш запрос более читаемым.

$criteria->join ='left join trip_registration tr ON 
    t.id=trlist.tripId AND tr.applicationState="initialized"'; 
+0

о югу выбрать, потому что левое соединение не даст мне результаты там, где нет 'tr', потому что' on' критерий не 'true' ... спасибо, что работал :) – shampoo

+0

left join *. * возвращает вам тот же результат. Вы попробовали? –

+0

да, я поверила, что это не так :). У меня не хватило смелости сделать подзаголовок (как и вы), но я должен был это сделать. кажется, что если один из столбцов в состоянии 'on' не относится к' t', как 'tr.applicationState =" initialized ", оператор будет выражаться как' false'. – shampoo

Смежные вопросы