Wednesday, August 27, 2014

Re: Basic data fetching

I would recommend changing recursive to -1 in the AppModel and using Containable, this way the only data you receive is the data you actually request and could possibly help your application in terms of speed by switching this off. http://book.cakephp.org/2.0/en/core-libraries/behaviors/containable.html

To populate a select box you can just do something like the following in your controller:
$this->set('devices', $this->Customer->Device->find('list')); If you name devices appropriately it will automatically populate the select box, otherwise you must specify like such:

echo $this->Form->input('device_id', array('options' => 'devices', 'empty' => '-----'));

Using device_id in the input and devices as the variable name should auto populate the input field, you can also pass empty to create a blank option first, and also you don't normally need to specify the input as select.


On 27 August 2014 21:47, Andras Kende <andras@gmail.com> wrote:
Try something like

$this->set('customer info',$this->Customer->find('first',array('recursive' => -1, 'conditions' => array('id'=>$customerId))));
adding 'recursive' => -1 will only get the customer data..

to get e select list for a customer devices
$this->set('customer info',$this->Customer->Device->find('list',array('conditions' => array('customer_id'=>$customerId))));

http://book.cakephp.org/2.0/en/models/retrieving-your-data.html

Andras Kende


On Aug 27, 2014, at 12:25 PM, Tristan Plumley <plumleytristan@gmail.com> wrote:

> Hello, I'm fairly new to cakephp and have a few pretty basic questions about fetching data from arrays:
>
> here is what i have set up
>
> Models:
>
> class Customer extends AppModel {
>
>
>  public $hasMany = array('Device','Change');
>
> }
>
> class Device extends AppModel {
>
>
>  public $belongsTo = 'Customer';
> }
>
>
> class Change extends AppModel {
>
>
>  public $belongsTo = 'Customer';
> }
>
>
> now anytime I
> $this->set('customerinfo',$this->Customer->find('first',array('conditions' => array('id'=>$customerId))));
>
> or find('all'), i get everything on that customer, including all devices and all thousands of changes.
>
> One of my questions is how should i manage that relationship since i dont want to pull that much change data just to get a customer ID, name and address?
>
> Have I built my model relationships too simple to allow for me for limiting what is being sent?
>
>
> question #2
>
> doing the above statement, i get the following returned:
>
>
> array(
>       'Customer' => array(
>               'id' => '33',
>               'name' => 'customer#33',
>               'totchngavail' => '5',
>               'totalchanges' => '0'
>       ),
>       'Device' => array(
>               (int) 0 => array(
>                       'id' => '6',
>                       'customer_id' => '33',
>                       'name' => 'device4',
>                       'type' => 'server',
>                       'os' => 'aix',
>                       'ip' => '123.123.123.123'
>               ),
>               (int) 1 => array(
>                       'id' => '31',
>                       'customer_id' => '33',
>                       'name' => 'dev2',
>                       'type' => 'server',
>                       'os' => 'linux',
>                       'ip' => '123.123.123.123'
>               )
>       ),
>       'Change' => array(
>               (int) 0 => array(
>                       'id' => '2',
>                       'customer_id' => '33',
>                       'name' => 'change12',
>                       'number' => '1234567890'
>               ),
>               (int) 1 => array(
>                       'id' => '4',
>                       'customer_id' => '33',
>                       'name' => 'change14',
>                       'number' => '1234567890'
>               )
>
>                      ///many many more changes
>       )
> )
>
>
>
> When i try and retrieve all the devices for that customer in a select box for example i try with:
>
> echo $this->Form->input('device_id',array('label'=> 'Device Name','style' => 'width: 150px;','type' => 'select',
> 'options' => displayDevices($customerinfo)));
>
> and here is the displayDevices function:
>
> function displayDevices($customerinfo){
> //a list 'header' so no device is selected by default
>  $var =array(NULL=>'---');
>  foreach($customerinfo['Device'] as $device)
>  {
>  $var+=array($device['id']=>$device['name']);
>  }
>  return $var;
> };
>
>
> So my question is: shouldnt there be a better way of displaying that select list? maybe by some form of $customerinfo['Device']['name'] right into the form input? When i do this i get an index error. I dont see how i should have to manually build an array to populate the select list when the complete customer array with devices comes in from the controller.
>
>
> thanks in advance for your advice.
>
>
> --
> Like Us on FaceBook https://www.facebook.com/CakePHP
> Find us on Twitter http://twitter.com/CakePHP
>
> ---
> You received this message because you are subscribed to the Google Groups "CakePHP" group.
> To unsubscribe from this group and stop receiving emails from it, send an email to cake-php+unsubscribe@googlegroups.com.
> To post to this group, send email to cake-php@googlegroups.com.
> Visit this group at http://groups.google.com/group/cake-php.
> For more options, visit https://groups.google.com/d/optout.

--
Like Us on FaceBook https://www.facebook.com/CakePHP
Find us on Twitter http://twitter.com/CakePHP

---
You received this message because you are subscribed to the Google Groups "CakePHP" group.
To unsubscribe from this group and stop receiving emails from it, send an email to cake-php+unsubscribe@googlegroups.com.
To post to this group, send email to cake-php@googlegroups.com.
Visit this group at http://groups.google.com/group/cake-php.
For more options, visit https://groups.google.com/d/optout.



--
Kind Regards
 Stephen Speakman

--
Like Us on FaceBook https://www.facebook.com/CakePHP
Find us on Twitter http://twitter.com/CakePHP

---
You received this message because you are subscribed to the Google Groups "CakePHP" group.
To unsubscribe from this group and stop receiving emails from it, send an email to cake-php+unsubscribe@googlegroups.com.
To post to this group, send email to cake-php@googlegroups.com.
Visit this group at http://groups.google.com/group/cake-php.
For more options, visit https://groups.google.com/d/optout.

No comments: