On Saturday, 15 March 2014 06:46:37 UTC+1, Justin Atack wrote: > > Hi All, > > I think I have found a bug in CakePHP... but I could be wrong as I'm a > CakePHP newbie... The code can be seen here if you prefer it colour coded: > http://pastebin.com/eXSpbAmw > > Heres some code from my AssignmentsStudentSController.php. It should pull > a list of names from the students DB who are registered as an "Assistant" > in a joining table two models away. > > $assistantOptions = array( > 'joins' => array( > array( > 'table' => 'schools_students', > 'alias' => 'SchoolsStudent', > 'type' => 'INNER', > 'conditions' => array('Assistant.id = SchoolsStudent.student_id') > ) > ), > 'fields' => array( > 'Assistant.id', > 'CONCAT(Assistant.given_name, " ", Assistant.family_name) AS > Assistant__assistant_fullname' > ), > 'conditions' => array( > 'Assistant.active' => 1, > 'Assistant.role_id' => array(4, 5, 6), > 'SchoolsStudent.assistant' => 1, > 'SchoolsStudent.school_id' => 1 > ), > 'order' => array( > 'Assistant__assistant_fullname' => 'ASC' > ) > ); > $assistants = $this->AssignmentsStudent->Assistant->find('list', > $assistantOptions); >
That is a lot of code to have in your controller - put it in the model =) > > The above code actually produces SQL that works correctly when I paste it > into SequelPro and run it... this is the bit that's very strange to me... > why does it work perfectly in SequelPro but not in CakePHP? Even stranger > is that CakePHP actually produced the correct SQL query. > > SELECT `Assistant`.`id`, CONCAT(Assistant.given_name, " ", > Assistant.family_name) AS Assistant__assistant_fullname FROM > `jwtalks_tms`.`students` AS `Assistant` INNER JOIN > `jwtalks_tms`.`schools_students` AS `SchoolsStudent` ON (`Assistant`.`id` = > `SchoolsStudent`.`student_id`) WHERE `Assistant`.`active` = '1' AND > `Assistant`.`role_id` IN (4, 5, 6) AND `SchoolsStudent`.`assistant` = '1' > AND `SchoolsStudent`.`school_id` = 1 ORDER BY > `Assistant__assistant_fullname` ASC > > However when I look at my AssistantsStudent:add view I get the following > Array > > Array > ( > [100] => > [41] => > [39] => > [44] => > [67] => > [90] => > [76] => > [49] => > [30] => > [98] => > [102] => > [71] => > [112] => > [57] => > [116] => > [50] => > [17] => > [107] => > [52] => > [92] => > [31] => > [24] => > [18] => > [42] => > [2] => > [56] => > [38] => > [109] => > [83] => > [87] => > [75] => > [68] => > [7] => > [105] => > [85] => > [5] => > [59] => > [69] => > [22] => > [114] => > ) > > > This produces a list with no names because as you can see they are missing > from the array however the ID's are present so the list is still filled but > with blanks. > Find list<https://github.com/cakephp/cakephp/blob/master/lib/Cake/Model/Model.php#L3114> uses Hash::combine - it's going to be using a value path that doesn't exist with the aliased field, and hence returning null. If you debug the end of that method you may figure out a way to modify your current usage to do that. > Now before you say just use a "VirtualField"... I know about these and how > to use them. > However what I need to do is produce lists with data from various models, > so I need to join and CONCAT this information. If I do this using a > "VirtualField" I get SQL errors because the field doesn't exist... that's > because it's in another model. > virtual fields<https://github.com/cakephp/cakephp/blob/master/lib/Cake/Model/Model.php#L545> are defined with a public property - you can define them on the fly. Alternatively use find all, and a foreach loop to format the list _*in your model_.* AD -- 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 [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/cake-php. For more options, visit https://groups.google.com/d/optout.
