#mysql #cakephp #join
#mysql #cakephp #Присоединиться
Вопрос:
На моем сайте CakePHP я хочу создать выпадающий список всех Venues
и любых, Restaurants
которые имеют is_venue=1
.
Я пробовал это в моем events_controller:
$venueOptions = array(
'fields' => array('id', 'name_address'),
'order' => array('name'),
'join' => array(
array(
'table' => 'restaurants',
'alias' => 'Restaurants',
'type' => 'inner',
'fields' => array('id', 'name'),
'foreignKey' => false,
'conditions' => array('restaurants.is_venue = 1')
)
),
);
$venues = $this->Event->Venue->find('list', $venueOptions);
Но, похоже, он все еще просто получает места проведения. Мне действительно не нужна связь между ними, поскольку их ассоциации будут связаны с событием, а не друг с другом.
Где я ошибся? Я близок к этому, но мне просто нужно настроить этот код, или я просто все вместе делаю неправильно?
Ответ №1:
Я думаю, вы могли бы сделать что-то вроде:
<?php
....
$v = $this->Venue->find( 'list' );
$r = $this->Restaurant->find( 'list' );
$venues = Set::merge( $v, $r );
natcasesort( $venues );
// print_r( $venues );
$this->set( 'venues', $venues );
...
?>
Что очень похоже на приведенный выше код — я просто использую класс Set и удостоверяюсь, что Controller::устанавливает переменную в view.
Также добавлена некоторая базовая сортировка, чтобы показать вам один вариант, хотя сортировка массива не имеет ничего общего с CakePHP.
Также исправлены некоторые неправильные имена переменных, в которых я изначально использовал $ venues и $ restaurants — изменены, чтобы они были последовательно $ v и $ r.
Комментарии:
1. В чем смысл Set::merge (в отличие от array_merge, упомянутого ниже? (также — я предполагаю, что вы имеете в виду слияние ($ v, $ r), правильно?)
2. @Abba — С некоторыми изменениями это в значительной степени работает — единственная проблема сейчас — все рестораны отображаются внизу, а не в алфавитном порядке — есть мысли о том, как это исправить?
3. Это массив — попробуйте использовать некоторые из удобных функций сортировки, встроенных в php. php.net/manual/en/array.sorting.php — Пример отредактирован, чтобы показать естественную сортировку без учета регистра, но есть масса вариантов.
4. Set::merge не является точной функциональной копией array_merge. Я предпочитаю использовать классы cake для таких вещей, когда они существуют, поскольку я предполагаю, что они были написаны для обработки любых пограничных случаев, специфичных для cake, и для работы с их структурированием данных.
5. Я перепробовал практически все PHP sort, asort, ksort … и т.д., Которые я мог придумать — все они ничего не делают в массиве print_r — не уверен, почему. Я попробую natcasesort, чтобы посмотреть, работает ли это, спасибо!
Ответ №2:
Объединение не будет работать, если между ними нет связи. Venue
и Restaurant
. Вы должны вызывать их по отдельности и объединять результаты
$venues = $this->Event->Venue->find('list', $venueOptions);
$restaurants = $this->Event->Restaurant->find('list', array('conditions' => array('is_venue' => '1')));
$results = array_merge($venues, $restaurants);
// sort results
asort($results);
Комментарии:
1. @Ish Kumar С некоторыми изменениями это в значительной степени работает — единственная проблема сейчас — все рестораны отображаются внизу, а не в алфавитном порядке — есть мысли о том, как это исправить?
2. @Ish — Я думал, что это тоже сработает, но это не так — когда я пытаюсь print_r это, оно ничего не печатает. :/
3. Убедитесь, что вы НЕ делаете это таким образом
$results = asort($results);
? потому чтоasort
вызывается по ссылке и возвращает логическое значение.4. к сожалению, array_merge не сохраняет связь ключ => значение
5.
$results = $venues $restaurants
вместоarray_merge