How to generate a MySQL IS NOT NULL condition in CakePHP?
arrays, cakephp, field, find, mysql
Solution
Problem: your query results are an array, and you're telling SQL to assign a field name to each query result containing that array - virtual fields are only made to contain single level variables like strings.
Solution: use a `join` structure onto itself with those conditions which will return a nested result set along with each of your results. Use CakePHP's model relationships to do this:
<?php
class Transaction extends AppModel {
var $hasMany = array(
'Accounts' => array(
'className' => 'Transaction',
'foreignKey' => false,
'conditions' => array('Accounts.account IS NOT NULL')
)
);
}
?>
Example output:
Array(
'Transaction' => array( // transaction data),
'Accounts' => array( // associated transaction data with account set to null
)
Now, as you can probably gather from that result, if you return 1000 rows from `Transaction`, you'll get all results from `Accounts` nested into each Transaction result. This is far from ideal. From here, you can either make the join conditions more specific to target relevant `Accounts` records, or this is not the right approach for you.
Other approaches could be:
- Accounts model, uses `Transaction` database table, implicit find conditions are that `account is null`
- Manual query to retrieve these results in the afterFind() method of your `Transaction` model, which will retrieve these results once, and you'll then `return array_merge($accounts, $transactions)`
Problem
I'm trying to get a subset of results as a virtualField for use in my view. I may even be way off on how I'm approaching this, but here's what I've done so far: I started with this question here: CakePHP virtualField find all not null which lead to this little beauty. Now I have an issue where the find statement passing (Array) into the MySQL. My code looks like: ``` class Transaction extends AppModel { public function __construct($id = false, $table = null, $ds = null) { parent::__construct($id, $table, $ds); $this->virtualFields['Accounts'] = $this->find("all", array("conditions" => array("account !=" => null))); } ``` And I'm seeing: ``` Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Array' in 'field list' SQL Query: SELECT `Transaction`.`id`, `Transaction`.`name`, `Transaction`.`person_id`, `Transaction`.`account`, (Array) AS `Transaction__Accounts` FROM `my_database`.`transactions` AS `Transaction` WHERE `Transaction`.`person_id` = (2) ``` I've also tried `$this->Transaction->find` and `"Transaction.account !="`, to no avail. I've found some other issues with the (Array) but none that help my situation. Any pointers in the right direction would be great.