这些是从gii生成的,我想这样生成的所有规则都是正确的
是的,规则是正确的,并且在大多数用例中都很好。
这并不意味着它们适用于所有情况;
我从评论中假设您的结构是这样的:(
如果我错了,请使用适当的详细信息更新您的问题):为简单起见,
我将它们称为Order和OrderDetail
生成的模型:这些包含existance
您提到的规则
common\models\Order
common\models\OrderDetail
具有自定义数据库的模型:这些包含对getDb()
上面两个生成的模块的不同定义和扩展
common\modules\samplemodule\models\Order
common\modules\samplemodule\models\OrderDetail
现在模型中的模型samplemodule
将继承生成模型的规则。
请注意targetClass
以下生成的规则common\models\OrderDetail
:
[['id_order'], 'exist', 'skipOnError' => true, 'targetClass' => Order::className(), 'targetAttribute' => ['id_order' => 'id']]
Order::className()
意味着common\models\Order::className()
这意味着所有子类(无论命名空间如何)都将具有引用common\models\Order
.
在您的情况下:(modules\samplemodule\models\OrderDetail
使用不同的数据库)将验证是否存在common\models\Order
(来自默认数据库的订单)
所以这是我提出的解决方案:
for common\models\OrderDetail
(生成的类)删除existence
规则,并在单独的方法中定义它们
namespace common\models;
class OrderDetail extends ActiveRecord {
//..
public function rules(){
return ArrayHelper::merge([
// ..
// all the default generated rules except the existance ones
], static::existenceRules());
}
protected static function existenceRules(){
return [
[['id_order'], 'exist', 'skipOnError' => true,
// fqn not required it's just here to highlight the difference
'targetClass' => common\models\Order::className(),
'targetAttribute' => ['id_order' => 'id']]
];
}
// ..
}
common\modules\samplemodule\models\OrderDetail
覆盖existanceRules()
我们之前创建的方法链接正确的目标类
namespace common\modules\samplemodule\models;
class OrderDetail extends common\models\OrderDetail {
//..
// custom db:
public static function getDb(){
return Yii::$app->moduleDatabase;
}
// optional (if you need more rules here):
public function rules(){
return ArrayHelper::merge( parent::rules(), [
// rules that apply only in this context (this db)
]);
}
// this is required if to reference the correct `targetClass`
protected static function existenceRules(){
return [
[['id_order'], 'exist', 'skipOnError' => true,
'targetClass' => common\modules\samplemodule\models\Order::className(),
'targetAttribute' => ['id_order' => 'id']]
];
}
// ..
}
在这两种情况下,我都使用了目标类的全名来帮助突出差异,因为它们使用不同的数据库,相同的规则在父类和子类中都不起作用。
希望这对你有帮助。祝你好运。