web-dev-qa-db-ja.com

CakePHP:異なるコントローラーでモデルを使用する

プロジェクト用のコントローラー/モデルがあります。したがって、これはプロジェクトモデルなどを制御します。pages_controllerによって制御されているホームページがあります。ホームページにプロジェクトのリストを表示したい。それは行うのと同じくらい簡単ですか?

function index() {
    $this->set('projects', $this->Project->find('all'));        
}

私が得ているように私は推測していません:

Undefined property: PagesController::$Project

誰かが私を正しい方向に向けることができますか?

ジョーニー

15
iamjonesy

コントローラークラスのすべてのモデルを変数$usesでロードする必要があります。次に例を示します。

var $uses = array('Project');

または実際の使用方法

$this->loadModel('Project');
57

私の意見では、これを行う適切な方法は、現在のモデルに関数を追加して、他のモデルをインスタンス化し、必要なデータを返すことです。

次に、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人の作成者がいて、作成者には多くのレシピがある場合があります。これらの関係が機能する方法を定義すると、直感的で強力な方法でデータにアクセスできます。 ( ソース

2
DrewT

私にとっては、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() 。ただし、慎重に使用する必要があることに注意してください。アプリケーションの速度が低下する可能性があります。

0
Nik Chankov