我试图将我的自定义子查询转换成cakephp3模型语法,但我遇到了一些问题。下面是我的查询,这是工作良好,如果我做自定义查询。
$connection = ConnectionManager::get('default');
$results = $connection->execute("
SELECT
res.*, sa.sp_qty,
(sa.sp_qty - SUM(received + dumped +quarantined)) as remaining_qty
FROM (
SELECT
SUM(rs_receive_qty) as received,
SUM(rs_damage_qty) as dumped,
qs.qs_qty as quarantined,
rs_sp_id
FROM
`fp_received_stock` rs
INNER JOIN
fp_quarantine_stock qs ON
qs.qs_sp_id = rs.rs_sp_id
WHERE
`rs_sa_id` LIKE 'cbb31e17077e8ba0f6902d8416198dd4'
GROUP BY
rs_sp_id
) as res
INNER JOIN
fp_stock_product sa ON
sa.sp_sa_id = 'cbb31e17077e8ba0f6902d8416198dd4' AND
sa.sp_id = res.rs_sp_id
GROUP BY
res.rs_sp_id
HAVING
remaining_qty > 0
")
->fetchAll('assoc');
echo '<pre>';
print_r($results);
如果我打印这个查询,我将使用如下数组获得正确的数据。
Array
(
[0] => Array
(
[received] => 10
[dumped] => 0
[quarantined] => 5
[rs_sp_id] => 9d5743062b93e0dea1f6b4220e8d599d
[sp_qty] => 20
[remaining_qty] => 5
)
[1] => Array
(
[received] => 5
[dumped] => 1
[quarantined] => 1
[rs_sp_id] => a78606f989da4b6565aee8f6b13ab6e1
[sp_qty] => 10
[remaining_qty] => 3
)
)
现在我正试图用cakephp3way转换这个查询,下面就是我目前正在做的。
$ReceivedStock = $this->loadModel('ReceivedStock');
$stocks = $this->loadModel('Stocks');
$subquery = $ReceivedStock->find('all');
$subquery = $subquery
->select([
'received' => $subquery->func()->sum('rs_receive_qty'),
'dumped' => $subquery->func()->sum('rs_damage_qty'),
'quarantined' =>'qs.qs_qty',
])
->innerJoin(
['qs' => 'fp_quarantine_stock'],
['qs.qs_sp_id = ReceivedStock.rs_sp_id']
)
->where([
'rs_sa_id = "cbb31e17077e8ba0f6902d8416198dd4"'
])
->group('rs_sp_id');
$stocksList = $stocks->find('all');
$stocksList
->select([
'ReceivedStock__res.*',
'sa.sp_qty',
'remaining_qty' => 'sa.sp_qty - ' . $subquery->func()->sum('received + dumped + quarantined'),
'ReceivedStock__res' => $subquery,
])
->innerJoin(
['sa' => 'fp_stock_product'],
[
'sa.sp_sa_id' => "cbb31e17077e8ba0f6902d8416198dd4",
'sa.sp_id' => 'res.rs_sp_id'
]
)
->group('ReceivedStock__res.rs_sp_id')
->having([
'remaining_qty >' => 0
])
->toArray();
print_r($stocksList);exit;
但我有个错误
sqlstate[42000]:语法错误或访问冲突:1064您的sql语法有错误;查看与mysql服务器版本相对应的手册,以获得使用near'as的正确语法 ReceivedStock__res__*
,sa.sp\数量为 sa__sp_qty
,sa.sp_qty-在第1行显示为“remainin”
这就是我转换后的sql查询的样子。
SELECT
Stocks.sa_id AS Stocks__sa_id,
Stocks.sa_batch_no AS Stocks__sa_batch_no,
Stocks.sa_storage_id AS Stocks__sa_storage_id,
Stocks.sa_supplier_id AS Stocks__sa_supplier_id,
Stocks.sa_company_id AS Stocks__sa_company_id,
Stocks.sa_receiving_contact_name AS Stocks__sa_receiving_contact_name,
Stocks.sa_delivery_date AS Stocks__sa_delivery_date,
Stocks.sa_notes_for_sl AS Stocks__sa_notes_for_sl,
Stocks.sa_ref_document_1 AS Stocks__sa_ref_document_1,
Stocks.sa_ref_document_2 AS Stocks__sa_ref_document_2,
Stocks.sa_status AS Stocks__sa_status,
Stocks.sa_created_by AS Stocks__sa_created_by,
Stocks.sa_modified_by AS Stocks__sa_modified_by,
Stocks.sa_created_date AS Stocks__sa_created_date,
Stocks.sa_modified_date AS Stocks__sa_modified_date,
ReceivedStock__res.* AS ReceivedStock__res__ *,
sa.sp_qty AS sa__sp_qty,
sa.sp_qty - AS remaining_qty,
(
SELECT
(SUM(rs_receive_qty)) AS received,
(SUM(rs_damage_qty)) AS dumped,
qs.qs_qty AS quarantined
FROM
fp_received_stock ReceivedStock
INNER JOIN
fp_quarantine_stock qs ON qs.qs_sp_id = ReceivedStock.rs_sp_id
WHERE
rs_sa_id = "cbb31e17077e8ba0f6902d8416198dd4"
GROUP BY
rs_sp_id
) AS ReceivedStock__res
FROM
fp_stock_adjustment Stocks
INNER JOIN
fp_stock_product sa ON(
sa.sp_sa_id = : c0 AND sa.sp_id = : c1
)
GROUP BY
ReceivedStock__res.rs_sp_id
HAVING
remaining_qty > : c2
有人能告诉我我做错了什么吗?
2条答案
按热度按时间piztneat1#
好了,伙计们,我终于想出了自己的解决办法。下面是我的工作代码。
希望它能帮助那些陷入类似困境的人。
fiei3ece2#
我认为,你需要改变你使用计数的方式
至
裁判:https://book.cakephp.org/3.0/en/orm/query-builder.html#using-sql函数