cakephp: как получить доступ к другой модели, которая не имеет связи


У меня есть 3 таблицы: project, amenities и project_amenities.

Я добавляю только форму проекта, Я хочу добавить новые удобства, которые сначала добавляются в таблицу удобств, а затем в таблицу project_amenities.

Итак, я определил эти отношения:

Project hasMany Amenities

Amenity belongsTo Project

Я объявил в projects_controller: var $uses = array('Amenity');

Это дает ошибку для моего действия add здесь

if (!empty($this->data)){

    $this->Project->create();

Как

Notice (8): Undefined property: ProjectsController::$Project 
[APPcontrollersprojects_controller.php, line 60]

Edit Кроме того, я не могу сделать:

$this->Amenity->create();
$insertData = array('name' => $this->data['Project']['Amenity'][$i]['name']);
$this->Amenity->save($insertData);
4 3

4 ответа:

Я хотел бы предложить вам использовать $this->loadModel('ModelName'); в функции, где вам нужно. Затем вы можете использовать модель, как показано ниже

$this->ModelName->function();

С помощью массива $uses он становится доступным для всего контроллера. Что повлияет на вашу производительность.

Я бы не рекомендовал использовать $uses = array (), поскольку это противоречит цели построения отношений модели. Плюс это добавляет изрядную долю накладных расходов.

Вы должны использовать свои модельные отношения там, где это возможно:

$this->Project->create();
$this->Project->Amenity->create();
$this->Model1->Model2->Model3->Model4->create();

Если вы хотите использовать несвязанную модель, вы можете сделать:

$this->loadModel('NewModelName');
$this->NewModelName->action();

Проверить http://book.cakephp.org/view/1031/Saving-Your-Data и http://book.cakephp.org/view/992/loadModel

Вы должны указать модель проекта в переменной $uses:

$uses = array('Project','Amenity');
Но мне любопытно, почему у вас есть три таблицы, когда вам нужно одно отношение ко многим?

Решение для: сохранить для hasAndBelongsToMany

Я создал модель: projects_amenity.php, который имеет отношение к проекту и удобству. модель: проекты имеют отношение hasAndBelongsToMany с удобством контроллер: projects_amenities_controller

И в коде:

$this->loadModel('ProjectsAmenity');
for($i = 0; $i< count($this->data['Project']['Amenity']);$i++)
{                       
    $this->Amenity->create();   

    $insertData = array('name' => $this->data['Project']['Amenity'][$i]['name']);
    $amenity = $this->Amenity->save($insertData);   

    $amenityid = $this->Amenity->getLastInsertID();

    $projectid = $this->Project->getLastInsertID();

    $this->ProjectsAmenity->create();           
    $data['AmenityArr']  = array('project_id' =>  $projectid,'amenity_id' => $amenityid );

    $this->ProjectsAmenity->save($data['AmenityArr']);  
}