プロジェクト用のコントローラー/モデルがあります。したがって、これはプロジェクトモデルなどを制御します。pages_controllerによって制御されているホームページがあります。ホームページにプロジェクトのリストを表示したい。それは行うのと同じくらい簡単ですか?
function index() {
$this->set('projects', $this->Project->find('all'));
}
私が得ているように私は推測していません:
Undefined property: PagesController::$Project
誰かが私を正しい方向に向けることができますか?
ジョーニー
コントローラークラスのすべてのモデルを変数$uses
でロードする必要があります。次に例を示します。
var $uses = array('Project');
または実際の使用方法
$this->loadModel('Project');
私の意見では、これを行う適切な方法は、現在のモデルに関数を追加して、他のモデルをインスタンス化し、必要なデータを返すことです。
次に、ExampleというモデルのProjectモデルからデータを返し、Exampleコントローラーのデータを呼び出す例を示します。
サンプルモデル内でのプロジェクトモデルの使用:
<?php
/* Example Model */
App::uses('Project', 'Model');
class Example extends AppModel {
public function allProjects() {
$projectModel = new Project();
$projects = $projectModel->find('all');
return $projects;
}
}
サンプルコントローラーでそのデータを返す
// once inside your correct view function just do:
$projects = $this->Example->allProjects();
$this->set('projects', $projects);
サンプルビュー
<?php
// Now assuming you're in the .ctp template associated with
// your view function which used: $projects = $this->Example->allProjects();
// you should be able to access the var: $projects
// For example:
print_r($projects['Project']);
両方のモデルをコントローラーにロードするよりも、これが「より良い」方法であるのはなぜですか?プロジェクトモデルはサンプルモデルに継承されるため、プロジェクトデータはサンプルモデルスコープの一部になります。 (これがデータベース側で意味することは、2つのテーブルがSQL JOIN
句を使用して結合されることです)。
またはマニュアルが言うように:
CakePHPの最も強力な機能の1つは、モデルによって提供されるリレーショナルマッピングをリンクする機能です。 CakePHPでは、モデル間のリンクは関連付けによって処理されます。アプリケーション内の異なるオブジェクト間の関係を定義することは、自然なプロセスである必要があります。例:レシピデータベースでは、レシピには多くのレビューがあり、レビューには1人の作成者がいて、作成者には多くのレシピがある場合があります。これらの関係が機能する方法を定義すると、直感的で強力な方法でデータにアクセスできます。 ( ソース )
私にとっては、requestActionを使用する方が合理的です。このようにして、ロジックはコントローラーにラップされます。
例:
//コントローラープロジェクト:
class ProjectsController extends AppController {
function dashboard(){
$this->set('projects', $this->Project->find('all'));
}
$this->render('dashboard');
}
もちろん、/ app/views/projectsにdashboard.ctpを作成する必要があることに注意してください。
ページのダッシュボードビュー(おそらく/app/views/pages/dashboard.ctp)に次を追加します。
echo $this->requestAction(array('controller'=>'projects', 'action'=>'dashboard'));
このようにして、ロジックはプロジェクトのコントローラーに残ります。もちろん、/ projects/indexをリクエストすることもできますが、ページネーションの処理はより複雑になります。
詳細 requestAction() 。ただし、慎重に使用する必要があることに注意してください。アプリケーションの速度が低下する可能性があります。