LoginSignup
3
1

More than 3 years have passed since last update.

CakePHP3.8 と Laravel7.x の「書き方」の違い ~ORM周りその1~

Posted at

CakePHP3.8 と Laravel7.x の「書き方」の違い ~ORM周りその1~

前: 設定周り

Model の作成・設定

クエリの要約

  • 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 ではないので、普通のプロパティ参照のようになってしまう
3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1