LoginSignup
0
0

【備忘録】cakePHP4でControllerと違う名前のModelを使いたいとき

Posted at

Model側に処理を作っておく

データのやり取り自体はcontrollerの中ではなく、Model/XXTable.phpに書くのがスマートらしい。

Model/UsersTable.php
public function findUserDataOneByUsername($username)
{
    if(empty($username)) {
        return null;
    }
    return $this->find()
                ->where(['User.username' => $username])
                ->first();
}

同じ名称のModelを使用する場合

UsersController.php
class UsersController extends AppController
{
    public function view($username = null)
    {
        // findUserDataOneByUsername は Model/UsersTable.php に定義
        $user = $this->Users->findUserDataOneByUsername($username);
        $this->set(compact('user'));
    }
}

名称違いのModelを使いたい場合

PostsControllerの中で、Usersモデルを使いたいとき等。

PostsController.php

class PostsController extends AppController
{
    public function view($username = null)
    {
        $usersTable = $this->fetchTable('Users');

        $user = $usersTable->findUserDataOneByUsername($username);
        $this->set(compact('user'));
    }
}

cakePHP4.0では$this->loadModel('モデル名')でよかったけど、
cakePHP4.3以上では非推奨で、代わりに$this->fetchTable('モデル名')を使うらしい。

余談:Modelで別のModelを使いたい場合

Postsモデルの中で、Usersモデルを使いたいとき等。

Model/PostsTable.php
use Cake\ORM\TableRegistry;

public function findUserDataOneByUsername($username)
{
    $usersTable = TableRegistry::getTableLocator()->get('Logs');

    if(empty($username)) {
        return null;
    }
    return $usersTable->find()
                      ->where(['User.username' => $username])
                      ->first();
}

TableRegistry::getTableLocator()->get('Model名')はModelの中で使うみたいです。

0
0
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
0
0