Есть ли у кого-нибудь предложения или опыт, как выполнить подзапрос в SELECT, который напрямую зависит от значений в полях основного запроса в Cake PHP 3? Запрос показан ниже.
Я пытаюсь получить значение OnHand для каждого предмета на каждом складе. Мой список предметов и складов будет динамичным c. Некоторые пользователи могут видеть до 12 складов и 2K-3K товаров. С моим запросом в SQL я могу получить массив элементов, каждый из которых содержит 3 - 12 элементов. Хороший массив для легкого зацикливания в целях отображения.
Мой запрос действителен для SQL. Я получаю около 200 результатов. Я уверен, что я построил подзапросы не так, как надо, но я не мог понять, как выполнить подзапрос в выбранной части моего запроса.
Теперь я понимаю, что проблема не в пагинации, а в ResultSet ( duh, в сообщении об ошибке говорится, что с самого начала ). Я попытался запрос без нумерации страниц. Я могу беспокоиться о нумерации страниц позже . Просто
$query = $this->Inventory->Products->find('all', ['fields' => $select, 'conditions' => $conditions, 'order' => [$sort => $direction]]);
$ query-> all (), $ query-> toList () и $ query-> first () генерируют одинаковую ошибку ResultSet.
Примеры в Cake PHP документация и большинство (если не все, . Я уверен, что пропустил некоторые ) из других примеров в стеке, показывают подзапросы в разделе запросов FROM или WHERE или при объединении между таблицами.
ИЛИ
Я поступаю неправильно? Могу ли я получить ту же идею о результатах в другом запросе?
Любая и вся помощь очень ценится. Спасибо.
Кроме того, спасибо @ndm за редактирование моего поста, чтобы сделать его более удобным для чтения. Вы должны были работать. :)
Среда:
- Торт PHP 3.8.6
- PHP 7.3.7
- MS SQL 2014
код контроллера => индексный метод
debug($select);
выход
[(int) 0 => 'Products.ItemCode',
(int) 1 => 'Products.ItemName',
''03'' => '(SELECT OnHand FROM OITW WHERE ItemCode = Products.ItemCode AND WhsCode = '03')',
''04'' => '(SELECT OnHand FROM OITW WHERE ItemCode = Products.ItemCode AND WhsCode = '04')',
''05'' => '(SELECT OnHand FROM OITW WHERE ItemCode = Products.ItemCode AND WhsCode = '05')',
''06'' => '(SELECT OnHand FROM OITW WHERE ItemCode = Products.ItemCode AND WhsCode = '06')',
''07'' => '(SELECT OnHand FROM OITW WHERE ItemCode = Products.ItemCode AND WhsCode = '07')',
''08'' => '(SELECT OnHand FROM OITW WHERE ItemCode = Products.ItemCode AND WhsCode = '08')',
''09'' => '(SELECT OnHand FROM OITW WHERE ItemCode = Products.ItemCode AND WhsCode = '09')',
''14'' => '(SELECT OnHand FROM OITW WHERE ItemCode = Products.ItemCode AND WhsCode = '14')',
''15'' => '(SELECT OnHand FROM OITW WHERE ItemCode = Products.ItemCode AND WhsCode = '15')']
debug($conditions);
выход
['Products.validFor' => 'Y',
'Products.ItemCode LIKE ' => 'TCP%']
$this->paginate = [
'fields' => $select,
'conditions' => $conditions,
'order' => [$sort => $direction]
];
$query = $this->Inventory->Products->find('all', $this->paginate);
debug($query);
выход
SELECT
Products.ItemCode AS [Products__ItemCode],
Products.ItemName AS [Products__ItemName],
(SELECT OnHand FROM OITW WHERE ItemCode = Products.ItemCode AND WhsCode = '03') AS '03',
(SELECT OnHand FROM OITW WHERE ItemCode = Products.ItemCode AND WhsCode = '04') AS '04',
(SELECT OnHand FROM OITW WHERE ItemCode = Products.ItemCode AND WhsCode = '05') AS '05',
(SELECT OnHand FROM OITW WHERE ItemCode = Products.ItemCode AND WhsCode = '06') AS '06',
(SELECT OnHand FROM OITW WHERE ItemCode = Products.ItemCode AND WhsCode = '07') AS '07',
(SELECT OnHand FROM OITW WHERE ItemCode = Products.ItemCode AND WhsCode = '08') AS '08',
(SELECT OnHand FROM OITW WHERE ItemCode = Products.ItemCode AND WhsCode = '09') AS '09',
(SELECT OnHand FROM OITW WHERE ItemCode = Products.ItemCode AND WhsCode = '14') AS '14',
(SELECT OnHand FROM OITW WHERE ItemCode = Products.ItemCode AND WhsCode = '15') AS '15'
FROM
OITM Products
WHERE
(Products.validFor = :c0 AND Products.ItemCode like :c1)
ORDER BY
Products.ItemName ASC
$inventory = $this->paginate($query, ['limit' => 50]);
debug($inventory);
дает
Аргумент 1, передаваемый в Cake \ ORM \ Entity :: __ construct (), должен иметь массив типов, данный bool, вызванный в C: \ inetpub \ wwwroot \ vendor \ cakephp \ cakephp \ src \ ORM \ ResultSet. php в строке 602