CakePHP - HABTM - отправка данных из нескольких таблиц в представление - PullRequest
1 голос
/ 08 апреля 2011

Сценарий:

3 tables:
restaurants
cuisines
features

2 join tables:
cuisines_restaurants
features_restaurants

Вопрос:

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

У меня это работает с этим:

$restaurant = $this->Restaurant->find('all', array('conditions' => array('Restaurant.id' => $id)));
$this->set('restaurant', $restaurant);

И я называю это так:

echo "<span class='label'>Name:</span> " . $restaurant[0]['Restaurant']['name'] . "<br />";
echo "<span class='label'>Cuisine:</span> ";
    $cuisineList = "";
    foreach($restaurant[0]['Cuisine'] as $cuisine) {
        $cuisineList .= $cuisine['name'] . ", ";
    }
    echo substr($cuisineList,0,-2) . "<br />";

(и повторите для функций)

Но это кажется излишним, так как во всех уроках Cake, которые я вижу, метод view в контроллере просто имеет:

$this->set('restaurant', $this->Restaurant->read(null, $id));

Тогда они называют это так:

echo $restaurant['Restaurant']['name'];
...etc

Опять же - это работает - я просто хочу знать, есть ли лучший способ - способ, которым я сейчас занимаюсь, кажется неаккуратным по сравнению со всеми другими приятными вещами, которые Cake делает для меня! :)

1 Ответ

1 голос
/ 08 апреля 2011

Ваш рабочий код использует Model::find('all'), но когда вы хотите получить данные только одного ресторана, вы хотите использовать Model::find('first'). Я думаю, вы найдете, если вы измените первый параметр вашего звонка с 'all' на 'first', вы получите нужные данные в нужном формате.


В некотором смысле, в буквальном смысле нет никакой разницы между данными, возвращаемыми двумя следующими вызовами:

$data = $this->Restaurant->find('first', array(
    'conditions'=>array('Restaurant.id'=>$id)
));

или

$data = $this->Restaurant->read(null,$id);

Model::read по сути является оберткой для Model::find('first'), хотя она также немного устанавливает внутреннее состояние модели (задает свойства Model::id и Model::data перед возвратом данных, полученных с помощью Model::find('first') ).

...