Подтвердить что ты не робот

Могу ли я использовать одну модель внутри другой модели в CakePHP?

Можно ли использовать другую модель внутри одной модели?

Eg.

<?php
class Form extends AppModel
{
    var $name='Form';
    var $helpers=array('Html','Ajax','Javascript','Form');
    var $components = array( 'RequestHandler','Email');

    function saveFormName($data)
    {
        $this->data['Form']['formname']=$data['Form']['formname'];
        $this->saveField('name',$this->data['Form']['formname']);
    } 

    function saveFieldname($data)
    {
        $this->data['Attribute']['fieldname']=$data['Attribute']['fieldname'];
    }

}
?>
4b9b3361

Ответ 1

Старая нить, но я собираюсь перезвонить, потому что считаю, что ответы неполны и не имеют "почему". CakePHP имеет три способа загрузки моделей. Хотя только два метода работают вне контроллера, я упомянул все три. Я не уверен в доступности версии, но это основной материал, поэтому я считаю, что они будут работать.

App::import() только находит и require() файл, и вам нужно создать экземпляр класса для его использования. Вы можете указать import() тип класса, имя и путь к файлу.

ClassRegistry::init() загружает файл, добавляет экземпляр на карту объекта и возвращает экземпляр. Это лучший способ загрузить что-то, потому что он устанавливает вещи "Торт", как если бы вы загрузили класс обычными способами. Вы также можете установить псевдоним для имени класса, которое я нашел полезным.

Controller::loadModel() использует ClassRegistry::init(), а также добавляет модель как свойство контроллера. Он также позволяет $persistModel для кэширования моделей для будущих запросов. Это работает только в контроллере, и, если в вашей ситуации, я бы использовал этот метод перед другими.

Ответ 2

Вы можете создавать экземпляры других моделей из любой модели/контроллера, используя один из этих двух методов.

Если вы используете Cake 1.2:

App::import('model','Attribute');
$attr = new Attribute();
$attr->save($dataYouWantToSavetoAttribute);

Если вы используете Cake 1.1:

loadModel('Attribute');
$attr = new Attribute();
$attr->save($dataYouWantToSavetoAttribute);

Ответ 3

Очевидным решением, которое все пропустили, является создание association между двумя моделями, если это необходимо. Вы можете использовать его, чтобы иметь возможность ссылаться на одну модель изнутри другой.

class Creation extends AppModel {
    public $belongsTo = array(
        'Inventor' => array(
            'className'  => 'Inventor',
            'foreignKey'  => 'inventor_id',
        )
    );

    public function whoIsMyMaker() {
        $this->Inventor->id = $this->field('inventor_id');
        return $this->Inventor->field('name');
    }
}

Ответ 4

В CakePHP 1.2 лучше использовать:

ClassRegistry::init('Attribute')->save($data);

Ответ 5

Это будет просто

<?php
   class Form extends AppModel
    {
       //...
          $another_model = ClassRegistry::init('AnotherModel');
       //...  
    }
?>

Ответ 6

Если вы хотите использовать Model_B внутри Model_A, добавьте эту строку в начало файла Model_A:

App::uses('Model_B_ClassName', 'Model');

а затем вы сможете использовать его в Model_A. Например:

$Model_B = new Model_B_ClassName();
$result = $Model_B->findById($some_id);

Ответ 7

В CakePHP 3 мы можем использовать TableRegistry:: get (modelName)

use Cake\ORM\TableRegistry;

$itemsOb = TableRegistry::get('Items');
$items = $itemsOb->find("all");
debug($items);

Ответ 8

var $uses = array('ModeloneName','ModeltwoName');

Используя свойство $uses, вы можете использовать несколько моделей в контроллере вместо использования loadModel('Model Name').

App::import('model','Attribute');

- это способ использовать одну модель в другой модели. Лучшим способом будет использование ассоциации.