у меня есть Venue
таблица с 20+ столбцами.
у меня тоже есть favorite_venues
стол с колоннами
id | userId | venueId
Вот мой код, чтобы получить места
$this->Venue->virtualFields = array(
'bookedCount' => "SELECT count(*) FROM bookings WHERE venueId = Venue.id");
$result = $this->Venue->find('all', array('conditions'=>$conditions,
'order' => array('Venue.bookedCount DESC'),
'limit' => 20,
'offset' => $offset * 20
));
я хочу добавить условие, если я отправляю userId, он должен проверять каждое место, добавлено ли его в список избранного или нет, и установить
$venue['isFavorite'] = yes/no
Я не хочу цикл и проверяю каждое место, которое я получаю. Есть ли способ, который я могу включить в тот же запрос Mysql в CakePHP. Я не уверен, как поставить да / нет в качестве виртуального поля
Вы можете LEFT
присоединиться к вашему favorite_venues
таблицу, а затем, например, использовать CASE
оператор в виртуальном поле, который проверяет, есть ли связанная строка.
Вот непроверенный пример, чтобы проиллюстрировать, что я имею в виду. Я не знаю, как задействован идентификатор пользователя, поэтому вы должны понять это самостоятельно.
$this->Venue->virtualFields = array(
'bookedCount' => "SELECT count(*) FROM bookings WHERE venueId = Venue.id",
'isFavorite' => 'CASE WHEN FavoriteVenues.id IS NOT NULL THEN "yes" ELSE "no" END'
);
$result = $this->Venue->find('all', array(
'conditions' => $conditions,
'order' => array('Venue.bookedCount DESC'),
'limit' => 20,
'offset' => $offset * 20,
'joins' => array(
array(
'table' => 'favorite_venues',
'alias' => 'FavoriteVenues',
'type' => 'LEFT',
'conditions' => array(
'FavoriteVenues.venueId = Venue.id',
)
)
),
// don't forget to group to prevent duplicate results
'group' => 'Venue.id'
));
Смотрите также
Других решений пока нет …