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の中で使うみたいです。