takabanana
takabanana

Reputation: 637

How to access a related table field from a Controller?

I am trying to get an array structure of a database and a few of its fields from my controller. The fields I want are: Document.id, Document.name, Document.submission_date, and the Requester.name which is joined with: Requester.id = Document.requester_id

In my Controller:

Method A:

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

Can't seem to find 'Requester.name'

Method B:

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

Gives me:

    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'
        )
    )

But I need it to be in format:

    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'
        ),
    )

I can't seem to figure it out after going through the 2.0 CakeBook and on StackOverflow... Any help would be appreciated? Sorry - I'm still a n00b with CakePHP (but REALLY loving it so far!) Thanks!

Upvotes: 0

Views: 179

Answers (2)

thecodeparadox
thecodeparadox

Reputation: 87073

You can try this:

$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')
                            )
                        )   
                    );

Upvotes: 1

tigrang
tigrang

Reputation: 6767

You need to do a find('all') instead of a find('list') and you can use the fields key like you already are to limit the amount of info that's returned.

It won't come back exactly as you need the data, each field will be in a key of the model it belongs to - if you really need it in that format you can get away with using a virtual field, a custom find, or an afterFind callback to modify the data.

Find list is generally for an id => label formatted array.

Upvotes: 2

Related Questions