Как получить доступ к связанному полю таблицы из контроллера?

Я пытаюсь получить структуру массива базы данных и несколько ее полей с моего контроллера. Поля, которые мне нужны: Document.id, Document.name, Document.submission_date и Requester.name, которое объединено с: Requester.id = Document.requester_id

В моем контроллере:

Метод А:

$documents = $this->Document->find('list', array('fields' => array('Document.name', 'Requester.name', 'Document.submission_date')));

Не удается найти «Requester.name»

Метод Б:

$documents = $this->Document->find('list', array('fields' => array('Document.name', 'Requester.name', 'Document.submission_date'), 'recursive' => 0));

Дает мне:

    array(
        '2012-08-17' => array(
            'Document_A' => 'Requester_Z'
        ),
        '2012-08-05' => array(
            'Document_B' => 'Requester_Y'
        ),
        '2012-07-09' => array(
            'Document_C' => 'Requester_X'
        )
    )

Но мне нужно, чтобы он был в формате:

    array(
        (int) 0 => array(
            'id' => '16'
            'submission_date' => '2012-08-17'
            'name' => 'Document_A',
            'requester_name' => 'Requester_Z'
        ),
        (int) 1 => array(
            'id' => '41'
            'submission_date' => '2012-08-05'
            'name' => 'Document_B',
            'requester_name' => 'Requester_Y'
        ),
        (int) 2 => array(
            'id' => '213'       
            'submission_date' => '2012-07-09'
            'name' => 'Document_C',
            'requester_name' => 'Requester_X'
        ),
    )

Кажется, я не могу понять это после просмотра CakeBook 2.0 и StackOverflow... Буду признателен за любую помощь? Извините - я все еще n00b с CakePHP (но ДЕЙСТВИТЕЛЬНО люблю его до сих пор!) Спасибо!


person takabanana    schedule 03.10.2012    source источник


Ответы (2)


Вам нужно сделать find('all') вместо find('list'), и вы можете использовать клавишу fields, как вы уже делаете, чтобы ограничить количество возвращаемой информации.

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

Список поиска обычно предназначен для массива в формате id => label.

person tigrang    schedule 03.10.2012
comment
На самом деле, ключи МОГУТ быть (и даже предпочтительнее) полем id. В таком случае, что сработает лучше? - person takabanana; 03.10.2012
comment
Кроме того, я попробовал $documents = $this-›Document-›find('all', array('fields' =› array('Document.name', 'Requester.name', 'Document.submission_date'))); И $documents - NULL - я не могу понять, почему... - person takabanana; 03.10.2012

Вы можете попробовать это:

$documents = $this
                ->Document-
                >find('all', 
                        array(
                            'fields' => array('Document.name', 'Requester.name', 'Document.submission_date'),
                            'joins' => array(
                                'table' => 'requesters',
                                'alias' => 'Requester',
                                'type' => 'left',
                                'conditions' => array('Requester.id = Document.requester_id')
                            )
                        )   
                    );
person thecodeparadox    schedule 03.10.2012