[CakePHP4]find()->where()の条件に使用するパラメーターが正しくセットされない

# find()->where()でサブクエリを使う際に正しくパラメーターがセットされない
**原因**：値をバインドしていなかった
値をバインドとは？↓
https://book.cakephp.org/4/ja/orm/query-builder.html#id21

## 問題が起きたコード（例）
```ProductsTable.php
$subQuery = $this->find()
    ->select([
        'num' => $this->find()->func()->count('SubTable.id')
    ])
    ->from(['SubTable' => 'product'])
    ->where([
        'SubTable.del_flg' => 0,
        'SubTable.status_id'  => 1
    ]);
$sub2Query = $this->find()
    ->select([
        'num' => $this->find()->func()->count('Sub2Table.id')
    ])
    ->from(['Sub2Table' => 'product'])
    ->where([
        'Sub2Table.del_flg' => 0,
        'Sub2Table.status_id'  => 2
    ]);


$mainQuery = $this->find()
    ->select([
        'Products.id',
        'Products.name',
        'SubTable__num' => $subQuery
    ])
    ->where([
        'Products.del_flg' => 0,
        '('.$subQuery.') > ' => 0,
        '('.$sub2Query.') > ' => 0
    ])
    ->group('Products.name');
```
こんな感じのコードを書いて、$mainQueryをデバッグすると以下のような内容が出力されました。
```
/*
* 出力結果
*/
//$mainQuery（見にくいので改行した）
'sql' => 
'SELECT 
    `Products`.`id` AS `Products__id`, 
    `Products`.`name` AS `Products__name`, 
    (SELECT (COUNT(SubTable.id)) AS `num` 
    FROM `product` `SubTable` 
    WHERE (`SubTable`.`del_flg` = :c0 AND `SubTable`.`status_id` = :c1)) AS `SubTable__num` 
FROM `product` `Products` 
WHERE (
    `Products`.`del_flg` = :c2 AND 
    (
        SELECT (COUNT(SubTable.id)) AS `num` 
        FROM `product` `SubTable` 
        WHERE (
            `SubTable`.`del_flg` = :c0 AND 
            `SubTable`.`status_id` = :c1
        )
    ) > :c3 AND 
    (
        SELECT (COUNT(Sub2Table.id)) AS `num` 
        FROM `product` `Sub2Table` 
        WHERE (
            `Sub2Table`.`del_flg` = :c0 AND 
            `Sub2Table`.`status_id` = :c1 //ここはstatus_id = 2になってほしい
        ) 
    ) > :c4
) 
GROUP BY `Products`.`name` '

//パラメーター
'params' => [
    ':c0' => [
        'value' => (int) 0,
        'type' => null,
        'placeholder' => 'c0',
    ],
    ':c1' => [
        'value' => (int) 1,
        'type' => null,
        'placeholder' => 'c1',
    ],
    ':c2' => [
        'value' => (int) 0,
        'type' => null,
        'placeholder' => 'c2',
    ],
    ':c3' => [
        'value' => (int) 0,
        'type' => null,
        'placeholder' => 'c3',
    ],
    ':c4' => [
        'value' => (int) 0,
        'type' => null,
        'placeholder' => 'c4',
    ],
]

```
$sub2Queryの条件はstatus_id = 2になるはずが、status_id = :c1となっている
→:c1は1なので、うまくセットされていない

# 解決策
## 値をバインディングしてセットする必要がある
cakephpで勝手に割り振られるparamsをこちらであらかじめ決めてしまうイメージ
## bind()の書き方
where()内で使う値を、":○○"の形でキー（？）に置き換える（○○は自由に決めてOK）
where()に続く形で
->bind("設定したキー（:○○）" , セットしたい値 , セットしたい値のタイプ)を記述

セットしたい値のタイプは以下ページ参考
https://book.cakephp.org/4/ja/orm/database-basics.html#id8

## 修正後のソース
```ProductsTable.php
$subQuery = $this->find()
    ->select([
        'num' => $this->find()->func()->count('SubTable.id')
    ])
    ->from(['SubTable' => 'product'])
    ->where([
        'SubTable.del_flg = :int0',
        'SubTable.status_id = :int1'
    ]);
$sub2Query = $this->find()
    ->select([
        'num' => $this->find()->func()->count('Sub2Table.id')
    ])
    ->from(['Sub2Table' => 'product'])
    ->where([
        'Sub2Table.del_flg = :int0',
        'Sub2Table.status_id = :int2'
    ]);


$mainQuery = $this->find()
    ->select([
        'Products.id',
        'Products.name',
        'SubTable__num' => $subQuery
    ])
    ->where([
        'Products.del_flg = :int0',
        '('.$subQuery.') > :int0',
        '('.$sub2Query.') > :int0'
    ])
    ->bind(':int0',0,'string')
    ->bind(':int1',1,'string')
    ->bind(':int2',2,'string')
    ->group('Products.name');
```

$mainQueryの出力結果
```
//$mainQuery
'sql' => '
SELECT 
    `Products`.`id` AS `Products__id`, 
    `Products`.`name` AS `Products__name`, 
    (SELECT (COUNT(SubTable.id)) AS `num` 
    FROM `product` `SubTable` 
    WHERE (SubTable.del_flg = :int0 AND SubTable.status_id = :int1)) AS `SubTable__num` 
FROM `product` `Products` 
WHERE (
    Products.del_flg = :int0 AND 
    (
        SELECT (COUNT(SubTable.id)) AS `num` 
        FROM `product` `SubTable` 
        WHERE (
            SubTable.del_flg = :int0 AND 
            SubTable.status_id = :int1
        )
    ) > :int0 AND 
    (
        SELECT (COUNT(Sub2Table.id)) AS `num` 
        FROM `product` `Sub2Table` 
        WHERE (
            Sub2Table.del_flg = :int0 AND 
            Sub2Table.status_id = :int2 //:int2は2なので、正しく値がセットされている
        )
    ) > :int0
) 
GROUP BY `Products`.`name`'

//パラメーター
'params' => [
    ':int0' => [
        'value' => (int) 0,
        'type' => 'string',
        'placeholder' => 'int0',
    ],
    ':int1' => [
        'value' => (int) 1,
        'type' => 'string',
        'placeholder' => 'int1',
    ],
    ':int2' => [
        'value' => (int) 2,
        'type' => 'string',
        'placeholder' => 'int2',
    ],
]
```

bind()にパラメーターを設定しておくことで、想定通りのSQLを書くことができた！！
とりあえずbindにパラメーターを自分でセットしておくと、こういった不具合に悩まされることがなさそう。