2

多くのエントリーモデルがあるコンペティションモデルがあります。

[編集] スキーマは (大まかに) 次のようになります。

コンペ:

IDINT(11)

名前 VARCHAR(50)

日付DATETIME

エントリ:

IDINT(11)

競争_id INT(11)

ユーザー ID INT(11)

回答 VARCHAR(50)

isWinner INT(1)

私のpickWinner見解では、関連するすべてのエントリをループするフォームがありisWinner、ユーザーがエントリを勝者として選択できるようにするフィールドを提供しています。関連モデルなどの保存はかなり標準的であり、すべて正常に機能します。

Entry モデルの少なくとも 1 つが true に設定されるようにフォームを検証しようとしていisWinnerます (ユーザーは少なくとも 1 つの勝者を選択する必要があります)。

エントリ モデルに検証ルールを適用することは明らかにできません。各モデルはそれ自体しか認識しておらず、他のモデルの値は認識していないためです。

1 つのエントリ モデルのみを勝者として設定する必要があります。コンペティションに検証ルールを追加して、その子エントリ モデルの 1 つがisWinnertrue に設定されていることを検出できるようにするにはどうすればよいですか?

4

1 に答える 1

0

これを実現する 1 つの方法は、競合モデルに関係を追加して、勝者がいるかどうかを検出することです。

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']場合、単純にサイクルすることはできません1つがtrueに設定されていることを確認するものを通して?例えば:

$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 に答える