1

まず第一に、これが単純すぎるように聞こえたら申し訳ありません。ちなみに私はcakePHPを初めて使用します。

私の目的は、テーブルを介してリンクされているteam_idinコントローラーを拡張することです。seasonstandings

私の現在のモデルルールは次のとおりです。

  1. 毎シーズン多くの順位があります
  2. 各順位はチームを示します。
  3. 基本的に、シーズンとチーム=順位の間の多対多の関係です。

これが私のSeasonControllerです。

class SeasonsController extends AppController
{
    public $helpers = array('Html', 'Form');

    public function view($id)
    {
        $this->Season->id = $id;
        $this->set('season', $this->Season->read());
    }
} 

を介して単一のシーズンを閲覧する/cakephp/seasons/view/1と、$season配列は次のように表示されます。

Array
(
    [Season] => Array
        (
            [id] => 1
            [name] => English Premier League 2013/2014
            [start] => 1350379014
            [end] => 0
        )

    [Standing] => Array
        (
            [0] => Array
                (
                    [id] => 1
                    [team_id] => 1
                    [win] => 1
                    [lose] => 0
                    [draw] => 1
                    [GF] => 5
                    [GA] => 4
                    [season_id] => 1
                    [rank] => 1
                )

            [1] => Array
                (
                    [id] => 2
                    [team_id] => 2
                    [win] => 0
                    [lose] => 1
                    [draw] => 1
                    [GF] => 4
                    [GA] => 5
                    [season_id] => 1
                    [rank] => 2
                )

        )

)

結果はを示しているだけteam_idですが、どうすればさらに拡張できteam_idますか?

チームのモデルに以下を入れましたが、それでも自動リンクされません。以下は私のすべてのモデルです:

class Team extends AppModel
{
    public $name = 'Team';
    public $hasMany = array(
        'Standing' => array(
            'className' => 'Standing'
        ));
}

class Season extends AppModel
{
    public $name = 'Season';
    public $hasMany = array(
        'Standing' => array(
            'className' => 'Standing'
        ));
}

class Standing extends AppModel
{
    public $name = 'Standing';
    public $belongsTo = array(
        'Team' => array(
            'className' => 'Team',
            'foreignKey' => 'team_id',
            ),

        'Season' => array(
            'className' => 'Season',
            'foreignKey' => 'season_id',
            ),

        );
}
4

2 に答える 2

2

TLDR:

CakePHPの[Containable]の振る舞いを使用してください。


説明とコード例:

「Containable」を使用すると、必要な関連データを「含む」ことができます。データのレベル全体を盲目的にプルする(そして多くの場合メモリエラーを引き起こす可能性がある)「再帰的」の代わりに、「Containable」を使用すると、必要に応じて、フィールドまで取得するデータを正確に指定できます。

基本的に、モデルをに設定しますpublic $actsAs = array('Containable'); (AppModelでこれを行うことをお勧めします。これにより、Containableがすべてのモデルで使用できるようになります)。次に、取得する関連モデルの「contain」配列/ネストされた配列を渡します(以下の例を参照)。

それについて読み、指示に従うと、コードは次のようになります。

public function view($id = null)
{
    if(empty($id)) $this->redirect('/');

    $season = $this->Season->find('first', array(
        'conditions' => array(
            'Season.id' => $id
        ),
        'contain' => array(
            'Standing' => array(
                'Team'
            )
        )
    );
    $this->set(compact('season'));
}

CakePHPに慣れたら、このような関数をコントローラーに配置するのではなく、実際にモデルに移動する必要があります(「CakePHP Fat Models Skinny Controllers」を検索してください)が、今のところは機能させるだけです。:)

于 2012-10-16T15:38:49.283 に答える
0

使用する :

$this->Season->id = $id;
$this->Season->recursive = 2;
$this->set('season', $this->Season->read());
于 2012-10-16T15:28:39.330 に答える