我正在尝试使用以下模型关联动态创建虚拟字段:
Retailer
hasMany Invoice
Invoice
有多个Invoiceitem
每张发票都有一个日期(invoice_date)和价格(price_paid)。
我正在检索零售商,受各种条件限制,对于每个零售商,我想要检索上个月花费的金额。我决定开始稍微不那么雄心勃勃了,并取消对过去一个月金额的限制......相反,我现在就一直这样做!
我有以下虚拟字段的定义:
$this->Retailer->virtualFields['totalamount'] =
'SELECT SUM(price_paid) AS totalamount FROM invoices i JOIN
(SELECT retailer_id, MAX(invoice_date) AS maxdate FROM invoices
GROUP BY retailer_id) sm
ON i.retailer_id = sm.retailer_id GROUP BY i.retailer_id';
但是,当我检索结果时,出现以下错误:
SQLSTATE[21000]: Cardinality violation: 1242 Subquery returns more than 1 row
我真的只知道MySQL和虚拟字段的基础知识。
答案 0 :(得分:1)
您需要确保定义虚拟字段的代码(即子查询)返回单个值。您的代码(如错误消息所示)可以返回超过1行。您还需要将子查询与要返回的记录相关联。在您的情况下,我认为这意味着使用零售商模型的id列。
尝试将虚拟字段定义更改为:
(SELECT SUM(i.price_paid)
FROM invoice AS i
WHERE YEAR(i.invoice_date) = YEAR(CURRENT_DATE() - INTERVAL 1 MONTH)
AND MONTH(i.invoice_date) = MONTH(CURRENT_DATE() - INTERVAL 1 MONTH)
AND i.retailer_id = Retailer.id)