Могу ли я использовать одну модель внутри другой модели в CakePHP? - PullRequest
56 голосов
/ 11 июня 2009

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

Например.

<?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'];
    }

}
?>

Ответы [ 8 ]

119 голосов
/ 21 января 2011

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

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

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

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

26 голосов
/ 11 июня 2009

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

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

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

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

loadModel('Attribute');
$attr = new Attribute();
$attr->save($dataYouWantToSavetoAttribute);
15 голосов
/ 22 ноября 2012

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

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');
    }
}
11 голосов
/ 18 июня 2009

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

ClassRegistry::init('Attribute')->save($data);
4 голосов
/ 02 марта 2016

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

<?php
   class Form extends AppModel
    {
       //...
          $another_model = ClassRegistry::init('AnotherModel');
       //...  
    }
?>
1 голос
/ 06 февраля 2017

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

use Cake\ORM\TableRegistry;

$itemsOb = TableRegistry::get('Items');
$items = $itemsOb->find("all");
debug($items);
1 голос
/ 22 октября 2013

Если вы хотите использовать 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);
0 голосов
/ 09 декабря 2013
var $uses = array('ModeloneName','ModeltwoName');

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...