Извлекает все данные из одной таблицы и некоторые из другой в CakePHP

#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