CakePHP3.8 と Laravel7.x の「書き方」の違い ~ORM周りその1~
前: 設定周り
Model の作成・設定
- CakePHP は bake すれば設定など諸々自動で設定される(CakePHP の 命名規則に従っている限り)
https://book.cakephp.org/3/ja/quickstart.html#id5 - laravel は make することはできるが、設定などは自分の手である程度書く必要がある
https://readouble.com/laravel/7.x/ja/eloquent.html
クエリの要約
- CakePHP
カスタムファインダーメソッドで実装する
メソッド名を find〇〇 にし、 Query インスタンスを return する必要がある
public function findHyphen(Query $query, array $options)
{
return $query->where(['favorite' => 'KAT-TUN']);
}
public function findArasick(Query $query, array $options)
{
return $query->where(['favorite' => '嵐']);
}
public function findVeteran(Query $query, array $options)
{
return $query->where(['fan_career >' => '5']);
}
使うときは Table::find()
, Query::find()
にファインダー名を渡す
$usersTable = TableRegistry::getTableLocator()->get('Users');
$query = $usersTable->find('hyphen')->find('veteran');
- Laravel
ローカルスコープ で実装する
メソッド名を scope〇〇 にし、 Builder インスタンスを return する必要がある
public function scopeHyphen(Builder $query)
{
return $query->where('favorite', '=', 'KAT-TUN');
}
public function scopeArasick(Builder $query)
{
return $query->where('favorite', '=', '嵐');
}
public function scopeVeteran(Builder $query)
{
return $query->where('fan_career', '>', '3');
}
使うときは Model
, Builder
からスコープ名の関数を呼び出す
$users = Users::hyphen()->veteran()->get();
Iterable 問題(名前は勝手につけた)
ORM はそれぞれ、CakePHP => Query, Larabel => Builder だが、Iterable (簡単に言うと foreach できること)かどうかに違いがある。
- CakePHP
$query = $usersTable->find('hyphen')->find('veteran');
foreach ($query as $entity) // foreach されるタイミングで SQL が発行・fetch され、レコードを foreach することができる
- Laravel
$builder = Users::hyphen()->veteran();
foreach ($builder as $property) // iterable ではないので、普通のプロパティ参照のようになってしまう