2012-07-26 44 views
0

我在CakePHP中一起使用Associations to Link Models如何在使用关联和烘焙蛋糕时显示除id之外的其他字段

我有一个Player型号,使用$hasMany关系与Statistic型号相联系。所以基本上一个球员可以有很多统计数据

建立这些关系后,我使用cake bakePlayerStatistic模型生成控制器和视图。

一切正常,按预期工作,但是当我使用添加模板添加统计信息时,player_id被用作关联。

我的问题是如何设置模型以使用player_id作为关联,但使用类似于玩家的姓名作为添加模板中的下拉菜单。

目前,如果我添加一个新的统计信息,我会得到一个名为“Player”的下拉框,其中列出了所有玩家ID,但我想要的是让玩家的first_name和last_name在该下拉框中而不是id。我意识到我可以修改控制器或模板来完成此操作,但我想知道在设置模型时是否可以这样做,以便cake bake可以处理它。

机型号:

<?php 
class Player extends AppModel { 
    public $name = 'Player'; 
    public $belongsTo = array(
     'School' => array(
      'className' => 'School', 
      'foreignKey' => 'school_id' 
     ) 
    ); 
    public $hasMany = 'Statistic'; 
} 

统计模型:选择一个列表中的默认列时

<?php 
class Statistic extends AppModel { 
    public $name = 'Statistic'; 
    public $belongsTo = array(
     'Player' => array(
      'className' => 'Player', 
      'foreignKey' => 'player_id' 
     ) 
    ); 
} 

玩家表

`id|school_id|first_name|last_name|number|position 

回答

2

蛋糕使用模型的displayField属性。如果没有为模型定义,它将查找nametitle。所以在你的模型中你可以使用:

public $displayField = 'first_name'; 

这将在列表中显示玩家的名字。

如果你想显示领域是两个字段的串联,你可以在模型中使用virtual field像这样:

public $virtualFields = array(
    'name' => "TRIM(CONCAT(Player.first_name, ' ', Player.last_name))" 
); 

注意上述作品为MySQL。对于另一种数据库,您需要调整语法。例如,SQLite的将是:

TRIM(Player.first_name || ' ' || Player.last_name) 

然后加在你的模型:

public $displayField = 'name'; 
+0

+1完整的答案。 – 2012-07-26 21:40:38

+0

我添加了'public $ virtualFields = array( 'name'=>“TRIM(CONCAT(Player.first_name,',Player.last_name))” );'public $ belongsTo = array() '统计'模型中,然后使用蛋糕烘烤重新生成模型和视图,但没有任何变化。我把这个添加到了错误的部分吗? – bigmike7801 2012-07-26 22:18:06

+0

@ bigmike7801虚拟字段应该在'Player'模型中。我不认为你将不得不重新生成任何代码。 – 2012-07-26 22:19:51