人物情報を登録するテーブルを作成していたことのお話。
idは登録するたびに自動で数が増加していく使用ですが、カテゴリ分けしてそのカテゴリ内では別で数値を追加していく仕様にしたいとします。
例:
id : category : cate_id : name
1 : leader : 1 : 人物a
2 : member : 1 人物b
3 : leader : 2 : 人物c
もし、memberを新規追加する場合はcate_idの最大値を取得して1を足して登録したいわけで、cakePHPにはSQL関数にmax()というのが利用できるようなので、ネットや公式ドキュメントをみながら色々と文を作成してみました。
【例1】
$query = $this->People->find()->where(['People.category =' => 'member']);
$cate_id_max = $query->select(['People.cate_id' => $query->func()->max(['People.cate_id'])]);
【例2】
$query = $this->Players->find("all");
$cate_id_max = $query->select(['People.cate_id' => $query->func()->max(['People.cate_id'])])->first();
などなど、色々試してみたがエラーしか出ずに一向に取得できるとは思えないw
Cannot convert value of type array to string
これ、もし普通にSQL文書いて実行した方が早いんじゃない?と思い、まったく良い方向に向かわないこの自動SQL文生成は捨てて、SQL文直書き実行の方法に移行してみました。
Controllerの上部に追加
use Cake\Datasource\ConnectionManager;
Action内で実行
$connection = ConnectionManager::get('default');
$results = $connection->execute('SELECT max(`cate_id`) as cate_id_max FROM peoples WHERE category = 'member' limit 1')->fetchAll('assoc');
debug($results);
(int) 1 // 結果
はい、終了w
cakePHPって、色々と関数用意されていますけど、やたらと組み合わせなければならない状態なほど、直で行う方が早いもの多いですよね。
フォームもフォームヘルパ―使ってやるものよりも直書きした方が早くフォーム構築できたりしますしね。
時と場合を考えて使い分けた方がハマらずにいけるということが良い勉強になりました。