i have a problem i can't figure out
in my cake app i have a form that saves multiple data..
one of my input fields is a select field so i have in the view:
echo $form->input('Booking.room_id', array(
'type' => 'select',
'options' => $booking_options
));
where $booking_options is an array that outputs:
Array
(
[23] => Room name1
[24] => Room name2
)
so when i save the form...
the values in the Booking table for room_id are not 23 or 24 but instead they save as 13 and 14
where can be the problem?
Not the answer to your problem, but you should try the Cake way of populating Select boxes properly!
In your controller:
function add() {
$this->set('rooms',$this->Booking->Room->find('list'));
}
In your Form
$this->Form->input('room_id');
This will automatically create a select box with the rooms found in the find('list'), this lowers the chance on errors.
(make sure the 'rooms' table uses the fields 'id' and 'name')
Related
I am using CakePHP 2.10.20 for a legacy project that requires a field to store a year. So no days or months are needed, just years. I have tried to use the MySQL YEAR field type, as well as an INT(4).
I'm using the FormHelper to create a year input as following ...
echo $this->Form->input('User.test_year', [
'type' => 'date',
'dateFormat' => 'Y',
'minYear' => date('Y'),
'maxYear' => date('Y') + 1
]);
After saving the request data contains an array for the User.test_year field which looks like ...
array(
'User' => array(
'id' => '1',
'test_year' => array(
'year' => '2020'
)
)
)
CakePHP always uses the array format for dates. When I usually debug a full date field (so year + month + day) in the beforeValidate() callback, it is already converted to the proper string format. However, when I try to debug this year-only field in beforeValidate(), it is still formatted as the same array.
Therefore, upon saving, I am confronted with a PHP notice and a MySQL error ...
Array to string conversion [CORE/Cake/Model/Datasource/DboSource.php, line 2220]
Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Array' in 'field list'
SQL Query: UPDATE `my_database`.`users` SET `id` = 1, `test_year` = Array, `modified` = '2020-04-14 23:10:32' WHERE `my_database`.`users`.`id` = '1'
Clearly the year in the array is not being converted into a proper string prior to being inserted into the database. I've also tried to use the FormHelper::year() method instead of the generic FormHelper::input(), but this does not change anything.
Really curious to learn what I'm doing wrong or overlooking, so thumbs up in advance to any CakePHP aficionados willing to point me in the right way.
Stay safe and thanks!
I have a table called posts that stores all the posts . It has two columns "Created" and "Modified" .
Below is my query in the model :
$options = [
'conditions' => [
'circle_id' => $my_circle_list,
'team_id' => $this->current_team_id,
'modified BETWEEN ? AND ?' => [$start, $end],
],
'order' => ['modified'=> 'desc'],
'limit' => $limit,
'fields' => ['post_id'],
];
$res = $this->find('list', $options);
Now i want the latest edited posts on top and below is what my mysql dump reads like :
SELECT `Post`.`id` FROM `db`.`posts` AS `Post` WHERE `Post`.`id` IN (125, 124) AND `Post`.`del_flg` = '0' ORDER BY `Post`.`modified` desc LIMIT 20
If i run this query in my database editor ,it gives my the correct output , but in my controller the ordering changes again , this is something i figured after i debugged the array values.
Would be helpful if anyone could tell me if there's any specific reason behind this . The call to this model method from the controller is done in a conventional manner .
When using $this->find() after Cake has queried the database with the generated SQL it calls the afterFind() method on the model where it can manipulate the data. This is the mostly likely place for the ordering to have been modified.
I'm have a relationship setup between two tables (Contacts and Quotes) and I'm trying to access the information from Contacts Quotes Controller. So in QuoteController.php I have the following code:
$contacts = $this->Quote->Contact->find('list', array('fields' => array(
'Contact.id',
'Contact.name',
'Contact.company',
'Contact.mainAddressLine2',
'Contact.mainAddressTown',
'Contact.mainAddressPostCode',
'Contact.mainAddressCountry'
)));
$this->set(compact('contacts'));
echo '<pre>';
print_r($contacts);
echo '</pre>';
The output from the print_r statement is:
Array
(
[1] => Joe Bloggs
[21] => Jane Doe
)
As you can see I'm only getting the id and name, for some reason the company, mainAddressLine2 etc are coming through in the array.
Ultimately I want the user to be able to select the Contacts name from a drop down list which will then, then details from the Contacts table will be populated in the Quotes view.
Any help appreciated.
$this->Quote->Contact->find('list', will only render a 1d array, change it to all instead of list. You may also want to look into the containable behaviors.
btw pr($contacts); is a built in convenience function of php
If you're looking to get all of the fields listed, why not use a find('all'). The find list, with 2 field params will return array with key->value while adding a 3rd field will group the results. see documentation on find options
$contacts = $this->Quote->Contact->find('all', array('fields' => array(
'Contact.id',
'Contact.name',
'Contact.company',
'Contact.mainAddressLine2',
'Contact.mainAddressTown',
'Contact.mainAddressPostCode',
'Contact.mainAddressCountry'
)));
$this->set(compact('contacts'));
echo '<pre>';
print_r($contacts);
echo '</pre>';
I'm sorry, I am a newbie in CakePHP and I am a little bit confused in this subject, let me explain:
I have a relationship between two tables. One of the table is Dose and the other is tank. So, one Tank belongs to a Dose. A Dose has many Tanks. The table schema is:
CREATE TABLE `doses` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`dose` INT(5) NULL DEFAULT NULL,
PRIMARY KEY (`id`)
)
In my Tank view I have the following code:
<?php echo $form->input('dose_id', array('class'=>'input', 'label' => ''));?>
Each 'dose' (field) from Dose table correspond to a value, such as 200, 300, and so forth. I need to use these numbers to calculate others numbers before to insert into my database (table tank). For instance, my code in tanks_controllers:
$t_u = $this->data['Tank']['tipo_uso_id'];
if( $t_u == '1'){
$this->data['Tank']['producao_adubo_diaria'] = $this->data['Tank']['dose_id'] * 0.10;
.
.
.
However, it is bringing to me the ID of the Dose and not the value (dose field). Where can I set up this to bring me the correct data (dose)? I tried to set up this way in my model:
'Dose' => array(
'className' => 'Dose',
'foreignKey' => 'dose_id',
'conditions' => '',
'fields' => 'dose',
'order' => ''
)
It did not work.
I appreciate your time helping me.
Thanks in advance.
it is bringing to me the ID of the Dose and not the value (dose field). Where can I set up this to bring me the correct data (dose)?
You need to get it from the db (model), not from the view. So you need to do a find(). If you are new to Cake, you should read the cookbook first to see how it works.
What does $form->input('dose_id') produce? A dropdown? If so; by default cake will produce a dropdown with the value containing (dose_)id, and the text you see as the value of $displayField(usually name/title).
To do this; if I understand you, you would need to first query doses for all the values and store the result in an array using the dose value as the key AND the value, rather than the id as you normally would. You would then be able to access the actual dose value from $this->data.
$doseArray=array();
$doses = $this->Dose->find('all');
foreach($doses['Dose'] as $k => $v) {
$doseArray[$v] = $v;
}
perhaps. Seems a bit redundant so I might be off.
I am trying to 'tag' multiple 'points' with multiple tags. I'm tagging my single points successfully. Unfortunately, when i try and use a tag, such as 'test2' on another point as a tag it is either giving me a duplicate entry error if i have my 'unique' set to false or if 'unique' is set to true, it will del my tag for all other points for 'test2' and create a single new one.
Here is what i have for my post data:
Array
(
[Tag] => Array
(
[id] => 4b7af6d7-787c-4f10-aa49-2502c0a80001
[name] => Test2
)
[Point] => Array
(
[id] => 4b47c66f-a130-4d12-8ccd-60824051e4b0
)
)
In my tag model i have this:
public $hasAndBelongsToMany = array(
'Point' => array(
'className' => 'Point',
'joinTable' => 'points_tags',
'foreignKey' => 'tag_id',
'associationForeignKey' => 'point_id',
'unique' => false)
);
I have tried this with 'unique' set as true, too. Unfortunately, this will delete any other instances of 'Test2' in the join table ('points_tags').
I have tried this using both save() and saveAll(). Both are giving me this error:
Warning (512): SQL Error: 1062: Duplicate entry '4b7af6d7-787c-4f10-aa49-2502c0a80001-4b47c66f-a130-4d12-8ccd-608' for key 'MAN_ADD' [CORE/cake/libs/model/datasources/dbo_source.php, line 527]
Query: INSERT INTO points_tags (tag_id,point_id,id) VALUES ('4b7af6d7-787c-4f10-aa49-2502c0a80001','4b47c66f-a130-4d12-8ccd-60824051e4b0','4b7b39f3-46f8-4744-ac53-3973c0a80001')
Thoughts????
Suggestions????
Where does the id come from? I'm guessing its a primary key of the table, and from what I understand from your post (please write more clearly, help us help you) the problem isn't with points or tags, but with the id in the points_tags table.
When you use the save method, are you doing it inside of a loop? Remember, best practice is to call model::create() whenever you're saving in a loop.
I frequently find that when I have issues with the HABTM saving behavior, it's because I didn't call model::create.