我正在尝试在扩展db\activerecord
的模型类中使用自定义属性。
我已尝试声明public $categories = []
,然后直接通过$model->categories = [1,2,3]
或在我的模型类public function setCategories($ids) {...
中使用setter方法为其分配值,然后再通过{{1}分配}。
我也尝试使用$model->categories = [1,2,3]
更新属性。
在所有情况下,$model->setAttribute('categories', [1,2,3])
都未填充。
我的最终目标是为模型分配类别,然后使用$model->categories
和afterSave()
可以这样做,还是应该从beforeSave()
扩展我的模型类?如果我这样做,我将失去什么功能?
修改 我可能误会了我的问题。
我有一个表单,用户可以在其中选择特定型号的类别(即“产品”)。所有类别都是预先存在的,产品通过联结表product_category('product_id','category_id')与一对多关系(一个产品有多个类别)分配到类别。
现在在处理视图的控制器中,我收到一个类别ID的列表,我想将它们分配给一个属性,以便我可以处理它们,即删除或添加(通过db\model
)条目特定产品的product_category表。
答案 0 :(得分:3)
class ClassName extends \yii\db\ActiveRecord
{
public $addition; //what attribute you want
/* your code */
public function fields()
{
$fields = parent::fields();
$fields[] = 'addition'; //the value must be the same as the new attribute
/* your code */
$this->addition = 'done'
return $fields
}
}
答案 1 :(得分:2)
在我看来,你是在手动尝试表之间的关系吗? 为什么不使用内置功能并为您处理它?</ p>
对于此(多对多),您需要一个链接activerecord或表格,指示哪些模型链接到哪些类别(我假设您有ActiveRecord
称为{{1}并且有一个ModelCategory
和一个model_id
:
category_id
(您也可以使用public function getProductCategories()
{
return $this->hasMany(ProductCategory::className(), ['product_id' => 'id']);
}
public function getCategories()
{
return $this->hasMany(Category::className(), ['id' => 'category_id'])
->via('productCategories');
}
代替viaTable()
,并避免使用额外的方法,这是您的选择。)
这意味着你可以这样访问它们:
via()
(总是使用关系的神奇功能,它实际上是数据库查询的__get()函数。)
对于分配关系,没有自动方法。 Yii虽然有一些辅助功能:
$product->categories
查看link
-function了解更多详情。
显然还有其他方法,但这取决于你的需求。
根据您的额外信息:
$category = new Category();
// Assign attributes
$category->save();
$product = new Product();
// Assign attributes
$product->save();
$product->link('categories', $category);
未经测试,但这应该可以让您了解如何解决这个问题。