Как создать метод, требующий несвязанных данных из нескольких таблиц в CakePHP - PullRequest
0 голосов
/ 08 января 2010

Я должен сделать представление, которое показывает несвязанные данные из нескольких таблиц. Я новичок в cakePHP (и PHP в целом), и, насколько я понимаю, каждая модель представляет собой описание только одной таблицы. Я знаю, что мы можем определить ассоциации с другими таблицами, но в моем случае мне нужно предоставить доступ к данным, которые никак не связаны с моделью, представление которой будет открыто.

Пример: Скажем, есть платформа для ведения блогов, и мы в настоящее время просматриваем сообщение. (Модель - Пост, функция - Читать). Теперь я хочу список (скажем) подписчиков нашей рассылки. Эти данные не связаны с моделью и, следовательно, я не думаю, что данные будут доступны для контроллера. Подскажите пожалуйста, как получить эти данные напрямую.

Ответы [ 4 ]

3 голосов
/ 08 января 2010

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

class SomeController extends AppController {
    public $name        = 'Some';
    public $uses        = array( 'Model1', 'Model2' );}

И затем, в вашем методе, вы просто вызываете эту модель:

$result = $this->Model1->find('all');
$result2= $this->Model2->find('all');
2 голосов
/ 09 января 2010

Есть несколько способов сделать это. Вот краткий обзор gwoo о том, как они отличаются и когда их использовать:

App :: import () включает только файл. Таким образом, вы бы новый, чтобы создать новый экземпляр каждый раз. Это не Рекомендуется

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

Контроллер :: loadModel (); Пользы ClassRegistry :: init () добавляет модель в свойство контроллера и также позволяет PersistModel быть включен.

Пока вы «можете» сделать любое из этих вещи, вы должны спросить себя, почему вы создаете зависимости от модели, которые не являются естественными для контроллер. Если вам нужно использовать любой из них, то я бы сделал это в обратный порядок описанного мной способа их. IE, Controller :: loadModel () тогда CR :: init () и на самом деле я никогда используйте App :: import () для моделей. надежда это помогает.

См. Эту страницу для полного обсуждения: http://groups.google.com/group/cake-php/browse_thread/thread/137c57b4eb010317

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

0 голосов
/ 09 января 2010

Вы можете сделать это с меньшим количеством кода и немного проще. Вы можете использовать AppController::loadModel('ModelName'). ( ссылка ) Этот метод обеспечивает этап инициализации, предложенный метробалдерами, а затем, если он станет

$this->loadModel('Subscriber');
$subscribers = $this->Subscriber->find('all', ... );

Была функция, которая устарела в 1.2, которая была просто loadModel('ModelName');, но не метод AppController. Также следует отметить, что вы не должны напрямую загружать модели в элемент, так как это не соответствует духу MVC. Держите это в модели. Использование этого метода, скорее всего, var $uses = array('ModelName');, уменьшает накладные расходы несвязанных моделей в методах, которые в нем не нуждаются, а также уменьшает некоторые сложности, которые могут возникнуть при использовании этого подхода.

0 голосов
/ 08 января 2010

Если вы собираетесь использовать его в паре функций в одной и той же модели, вы должны указать его внутри контроллера через:

$uses = array('Post', 'Suscriber');

Теперь, если это элемент макета, вы должны установить его для элемента.

По виду:

$ this-> renderElement ( 'suscribers-лист');

Теперь вы должны создать файл suscribers-list.ctp в views / elements. Оттуда импортируйте модель:

App::Import('Model', 'Suscriber');
$this->Suscriber = new Suscriber();

$suscribers = $this->Suscriber->find('all');
pr($suscribers);

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

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