0

私はここブラジルの大学のシステムを開発しています。このシステムには、次のモデルがあります。- 州; - 街; - 大学; - 単位; - クラス;

Ok。関係は次のとおりです。 - 国は国に属します。- 市は州に属します。-大学は国に属しています(私のデータベースでは、すべての国に州が登録されているわけではなく、すべての州に都市が登録されているわけではないため、ユーザーに大学を都市に登録するよう要求することはできませんでした); - ユニット所属大学; - クラスは大学に属します (すべての大学にユニットが登録されているわけではないため)。

Ok。これで、皆さんが私の状況を理解できるように、適切な背景を設定できたと思います。次に、質問自体に進みます。

私のモデルクラスのビューでは、国と(州市がある場合)を表示したいと思います。また、ユニットやユニバーシティなどの他のモデル ビューにそのようなコンテンツを表示する必要があるかもしれません。

しかし、クラス モデルでそれを実行しようとすると、country_id しか表示できません。私の大学のデータベース テーブルの外部キー。これは、Class モデルが University に属しているためで、University のプロパティに簡単にアクセスできるからです。ただし、国のIDにアクセスしたくはありません。名前が必要です。そして、将来的には他のプロパティが必要になるかもしれません。

それ、どうやったら出来るの?モデル クラスに直接関係がない場合、モデルの国のプロパティにアクセスするにはどうすればよいですか?

多くのハグとキス。誰かがこれで私を助けてくれることを願っています。

pS:私はちょっとした敗者の解決策を管理しました:私のクラスコントローラーでは、次のことを行いました(モデルの国、州、都市の変数にアクセスできるようにします):

  • View 関数で、State と City のモデルをロードしました (Class->University->Country の関係でアクセスできる国のモデル)。
  • 次に、find メソッドを使用して、view.ctp に表示したい問題のクラスのそれぞれの国、州、都市を見つけました。コードは次のとおりです。

    public function view($id = null) {    
        $this->Class->id = $id;
        $this->set('class', $this->Class->read());  
        $this->loadModel('State');  
        $this->loadModel('City');  
        $country = $this->Class->Universsity->Country->find('first', array('conditions' => array('Country.id' => $this->Class->data['University']['country_id']),));  
        $state = $this->State->find('first', array('conditions' => array('State.id' => $this->Class->data['University']['state_id']),));  
        $city = $this->City->find('first', array('conditions' => array('City.id' => $this->Class->data['University']['city_id']),));  
        $this->set('country',$country['Country']);$this->set('city',$city);  
        $this->set('state',$state);  
    }
    

そして、それはちょっとうまくいきます...私のWiew.ctpでは、Countryデータの配列、Stateデータの配列、およびCityデータの配列を取得します。そして、ビューで、州と都市の配列が長さ = 0 ではないかどうかを確認して、それらとすべてを表示します...しかし、これを行うためのより良い方法が必要だと思います。

PPS:

もう 1 つの質問は... Index.ctp はどうですか? 作業しているクラスがわからない場合はどうすればよいですか? ビューにロジックと検索メソッドが必要ですか? それは単にコードを台無しにするだけではありませんか?

4

1 に答える 1

1

コードを投稿しないと、正しい方向に向けることは困難です。ただし、モデルが正しく構成されているという前提で作業すると、次のことができるはずです。

ClassController.php

public class ClassController extends AppController{

    public $uses = array('Class');

    public function view($id){
        $class = $this->Class->find('first', array('conditions' => array('Class.id' => $id));
        $this->set('class', $class);
    }
}

view.ctp

<?php echo $class['Country']['name']?>

recursiveただし、CakePHP がすべての関連データを取得できるように、クラス モデルのパラメータを設定する必要がある場合があります。これは、次の 2 つの方法のいずれかで実行できます。

  1. モデルrecursive内でパラメーターを構成します (これを行う方法については、ドキュメントを参照してください)。これにより、データベースからレコードを取得し、オプションで属性を指定しない場合のデフォルト値が設定されます。Classrecursive
  2. メソッド呼び出しrecurisve内でパラメーターを設定します。find(...)取得するデータが不要な場合に、データベースに大きな負荷をかけるのを避けるのに役立つため、私はこれを好みます。

たとえば、コントローラーで次のことができます。

public function view($id){
    $class = $this->Class->find('first', array('conditions' => array('Class.id' => $id), 'recursive' => 3));
    $this->set('class', $class);
}

警告recursiveです。必要以上の値に設定しないでください。そうしないと、特に必要のないものを取得する可能性があります。関数を使用して、debug()モデルが現在取得しているものを調べて、より多くの情報に基づいた決定を下せるようにします。

debug($class);

これが何かの助けになることを願っています!

于 2013-06-07T16:28:02.920 に答える