使用关联和烘焙蛋糕时如何显示除 id 以外的其他字段

Posted

技术标签:

【中文标题】使用关联和烘焙蛋糕时如何显示除 id 以外的其他字段【英文标题】:How to display differnt field other than id when using Associations and baking cake 【发布时间】:2012-07-26 21:13:14 【问题描述】:

我在 Cakephp 中同时使用 Associations to Link Models。

我有一个Player 模型,它使用$hasMany 关系链接到Statistic 模型。所以基本上一个玩家可以有很多统计数据。

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

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

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

目前,如果我要添加一个新的统计信息,我会得到一个名为“玩家”的下拉框,其中列出了所有玩家 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

【问题讨论】:

【参考方案1】:

Cake 在选择列表的默认列时使用模型的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';

【讨论】:

我在public $belongsTo = array() 的上方和下方添加了` public $virtualFields = array( 'name' => "TRIM(CONCAT(Player.first_name, ' ', Player.last_name))" );`在 Statistic 模型中,然后使用 cake bake 重新生成模型和视图,但没有任何改变。我把这个添加到错误的部分了吗? @bigmike7801 虚拟字段应该在Player 模型中。我认为您不必重新生成任何代码。 @DougOwings,我也无法让它工作。它应该在 Players 模型中的哪一点上运行?在public $hasMany = 'Statistic'; 之前还是之后?此外,如果我希望此更改反映的视图是statistics/add,我为什么要将它放入 Player 模型中?感谢您的所有帮助! @bigmike7801 它可以放在 Player 模型中的任何位置。这为模型定义了一个额外的字段name,因此在您的应用程序中的任何时候,当您在 Player 模型上调用 find('list') 时,它将返回一个数组,其索引是玩家 ID 和玩家名称的值。尝试在 Player 模型中添加public $displayField = 'name';。确保您没有重新生成模型,因为这会覆盖您的更改。 我想我困惑的地方是我希望能够为我的控制器和视图运行cake bake,以便玩家姓名的下拉列表自动填充名字和姓氏,但是看来您的回答意味着我必须手动编辑视图并添加对虚拟字段的引用。我说的对吗?

以上是关于使用关联和烘焙蛋糕时如何显示除 id 以外的其他字段的主要内容,如果未能解决你的问题,请参考以下文章

如何使包装器返回除参考光标以外的其他内容

如何通过保留除一个以外的所有属性来随机打乱种群?

使用行 id 以外的键更新蛋糕 php 中的记录

关系型数据库三大范式

如何使用正则表达式 python3 替换除空格和换行符旁边的数字以外的所有其他符号

向 POST 请求传递/提供除表单以外的其他内容