1

首先,对不起,如果这听起来太简单了。顺便说一句,我是 cakePHP 的新手。

我的目标是扩展通过它链接的team_idin控制器seasonstandings

我目前的示范规则是:

  1. 每个赛季都有很多排名
  2. 每个排名代表一个团队。
  3. 基本上是赛季和球队=排名之间的多对多关系。

这是我的季节控制器:

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

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

当我浏览单个季节 thru/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]行为。


解释和代码示例:

“可包含”让您“包含”您想要的任何相关数据。与“递归”不同,后者盲目地提取整个数据级别(并且通常会导致内存错误),“可包含”允许您精确指定要检索的数据,甚至可以根据需要精确到字段。

基本上,您将模型设置为public $actsAs = array('Containable'); (我建议在您的 AppModel 中这样做,以便所有模型都可以使用 Containable)。然后,您传递要检索的关联模型的“包含”数组/嵌套数组(参见下面的示例)。

在阅读了它并按照说明进行操作后,您的代码应该类似于以下内容:

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 回答