Yii2 activerecord自定义属性

时间:2015-05-13 08:19:30

标签: php activerecord yii2

我正在尝试在扩展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->categoriesafterSave()

更新数据库关系/表格

可以这样做,还是应该从beforeSave()扩展我的模型类?如果我这样做,我将失去什么功能?

修改 我可能误会了我的问题。

我有一个表单,用户可以在其中选择特定型号的类别(即“产品”)。所有类别都是预先存在的,产品通过联结表product_category('product_id','category_id')与一对多关系(一个产品有多个类别)分配到类别。

现在在处理视图的控制器中,我收到一个类别ID的列表,我想将它们分配给一个属性,以便我可以处理它们,即删除或添加(通过db\model)条目特定产品的product_category表。

2 个答案:

答案 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);

未经测试,但这应该可以让您了解如何解决这个问题。