yii のモデルにデフォルト スコープを適用する方法に関するドキュメントがあまり見つかりません。誰かが説明してくれたり、正しい方向に向けてくれるのではないかと思っていました。
私の質問の簡単なバージョン:
リレーションをデフォルト スコープに追加したり、モデルのすべての AR 検索にデフォルトで「with」基準を追加したりすることは可能ですか?
私の質問の長いバージョン:
私のアプリの簡単な要約:
私は2つのモデルを持っていprovider
ますitem
. プロバイダーは多くのアイテムを持つことができますが、各アイテムは 1 つのプロバイダーしか持つことができない am:1 関係があります。
これまでのところ、次の関係があります。
class Provider extends CActiveRecord
{
...
public function relations()
{
return array(
'items' => array(self::HAS_MANY, 'Item', 'id_provider', 'order'=>'rank DESC'),
);
}
...
}
class Item extends CActiveRecord
{
...
public function relations()
{
return array(
'provider' => array(self::BELONGS_TO, 'Provider', 'id_provider'),
);
}
...
}
私のアイテム モデル内では、すべてのオフライン アイテムを除外する defaultScope を既に取得しています (つまり、 に設定されているアイテムのみを表示しますoffline = false
)。
public function defaultScope()
{
$alias = $this->getTableAlias(false,false);
return array(
'condition'=>"`$alias`.`offline` = false",
);
}
私が今やりたいことは、プロバイダーがオフラインに設定されているアイテムを除外することです (つまりprovider.offline = false
、現在の と並んでいるアイテムのみを表示しますitem.offline = false
)。
私は defaultScope で providers テーブルに参加しようとしました:
public function defaultScope()
{
$alias = $this->getTableAlias(false,false);
return array(
'join'=>"JOIN `provider` AS `provider` ON `provider`.`id` = `$alias`.`id_provider`",
'condition'=>"`$alias`.`offline` = false AND `provider`.`offline` = false",
);
}
ただし、JOIN は ON ステートメントの後に適用され、エラーが発生します ( CDbCommand failed to execute the SQL statement: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'provider.offline' in 'on clause'
)。
また、defaultScope に with 基準を追加しようとしました。
public function defaultScope()
{
$alias = $this->getTableAlias(false,false);
return array(
'with'=>"provider",
'condition'=>"`$alias`.`offline` = false AND `provider`.`offline` = false",
);
}
しかし、同じエラーが発生します: SQLSTATE[42S22]: 列が見つかりません: 1054 不明な列 'provider.offline' in 'on clause'`).
助言がありますか?