我正在尝试将结果的子集作为 virtualField 在我的 View 中使用。我什至可能离我如何处理这个问题还有很远的距离,但这是我到目前为止所做的:
我从这个问题开始:CakePHP virtualField find all not null这导致 this little beauty .
现在我遇到一个问题,即 find 语句将 (Array) 传递到 MySQL。
我的代码如下:
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)));
}
我看到了:
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)
我也尝试过 $this->Transaction->find
和 "Transaction.account !="
,但没有成功。我发现了 (Array) 的其他一些问题,但没有一个对我的情况有帮助。任何指向正确方向的指示都会很棒。
最佳答案
问题:您的查询结果是一个数组,您告诉 SQL 为包含该数组的每个查询结果分配一个字段名 - 虚拟字段仅包含单级变量,如字符串.
解决方案:在自身上使用join
结构,这些条件将返回一个嵌套的结果集以及您的每个结果。使用 CakePHP's model relationships这样做:
<?php
class Transaction extends AppModel {
var $hasMany = array(
'Accounts' => array(
'className' => 'Transaction',
'foreignKey' => false,
'conditions' => array('Accounts.account IS NOT NULL')
)
);
}
?>
示例输出:
Array(
'Transaction' => array( // transaction data),
'Accounts' => array( // associated transaction data with account set to null
)
现在,正如您可能从该结果中收集到的那样,如果您从 Transaction
返回 1000 行,您将从 Accounts
获得所有结果> 嵌套到每个交易结果。这远非理想。从这里开始,您可以使连接条件更具体以定位相关的 Accounts
记录,否则这不适合您。
其他方法可能是:
- Accounts 模型,使用
Transaction
数据库表,隐式查找条件是account is null
- 手动查询以在 afterFind() method 中检索这些结果
Transaction
模型,它将检索这些结果一次,然后您将返回 array_merge($accounts, $transactions)
关于mysql - 如何在 CakePHP 中生成 MySQL IS NOT NULL 条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20459606/