2

我有一个 Competition 模型,里面有很多 Entry 模型。

[编辑]架构看起来(大致)像这样:

竞赛:

编号 INT(11)

名称 VARCHAR(50)

日期日期时间

入口:

编号 INT(11)

竞争ID INT(11)

user_id INT(11)

回答 VARCHAR(50)

isWinner INT(1)

在我pickWinner看来,我有一个循环遍历所有相关条目的表单 - 提供该isWinner字段以允许用户选择一个条目作为获胜者。保存相关模型等是非常标准的,并且一切正常。

我正在尝试验证表单,以便至少有一个 Entry 模型isWinner设置为 true(用户必须选择至少一个获胜者)。

我显然不能将验证规则应用于 Entry 模型——因为每个模型只知道自己而不知道其他模型的值。

只有一个 Entry 模型应设置为获胜者 - 如何向 Competition 添加验证规则,以便它可以检测到其子 Entry 模型之一已isWinner设置为 true?

4

1 回答 1

0

实现这一点的一种方法是添加与 Competition 模型的关系以检测它是否有获胜者,例如;

public function relations()
{
    return array(
        ...
        'winners' => array(self::STAT, 'Entry', 'competition_id', 'condition'=>'`t`.`isWinner` = true'),
        ...
    );
}

然后以下应该返回给定比赛的获胜者人数:

$competition = Competition::model()->findByPk($id);
$winners = $competition->winners;

未经测试,因此您可能需要稍作改动。

编辑

好的,要在保存之前获取此信息,您可以执行以下操作:例如,如果在您的pickWinner视图中,您有每个模型的字段并且它作为数组提交回来,例如$_POST[Entry][$model->id]['isWinner']每个模型,您可以不简单地循环通过那些确保一个设置为真?例如:

$winners = 0;
foreach(array_keys($_POST[Entry]) as $key)
{
    if($_POST[Entry][$key]['isWinner']=='true')
        $winners++;
}

if($winners==0)
{
    echo "You selected no winners.";
} else if($winners>1) {
    echo "You selected too many winners.";
} else if($winners==1) {
    echo "Woot, 1 winner!";
}

同样,这取决于您的pickWinner表单的布局方式。

于 2012-11-27T17:26:04.803 回答