php - Yiti2 أكتيفريكورد السمة المخصصة




activerecord yii2 (2)

أحاول استخدام سمة مخصصة في فئة نموذج الذي يمتد db\activerecord .

لقد حاولت الإعلان عن public $categories = [] ثم قم بتعيين قيم لها مباشرة عبر $model->categories = [1,2,3] أو باستخدام طريقة الضبط في فئة public function setCategories($ids) {... فئة الفئة public function setCategories($ids) {... ومن ثم تعيين مرة أخرى عبر $model->categories = [1,2,3] .

لقد حاولت أيضا تحديث السمة مع $model->setAttribute('categories', [1,2,3]) .

في جميع الحالات $model->categories ليست مأهولة.

هدفي النهائي هو تعيين فئات إلى نموذج ثم قم بتحديث العلاقة ديسيبل / الجداول باستخدام afterSave() و beforeSave()

هل يمكن أن يتم ذلك أو يجب أن أقدم فئة نموذجي من db\model ؟ إذا فعلت، ما هي وظيفة سوف أخسر؟

تحرير ربما كنت قد أخطأت في مشكلتي.

لدي نموذج حيث يمكن للمستخدم تحديد فئات لنموذج معين (أي "المنتج"). جميع الفئات هي موجودة مسبقا ويتم تعيين المنتجات إلى فئات عبر الجدول تقاطع product_category ('product_id'، 'category_id') مع علاقة واحد إلى الكثير (منتج واحد لديه العديد من الفئات).

الآن في وحدة تحكم التعامل مع وجهة النظر، أنا أتلقى قائمة معرف الفئة و أريد تعيينها إلى سمة بحيث يمكن معالجتها أي حذف أو إضافة (عبر link() ) إدخالات في الجدول product_category ل منتج معين.


يبدو لي وكأنك تحاول يدويا أن تفعل العلاقات بين الجداول؟ لماذا لا تستخدم المدمج في وظيفة، وأنها اتخذت الرعاية بالنسبة لك؟

لهذا (العديد لكثير) تحتاج إلى أكتيفريكورد الارتباط أو الجدول الذي يشير إلى النماذج التي تصل إلى الفئات (أنا أفترض هنا أن لديك ModelCategory يسمى ModelCategory ويحتوي على model_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() وتجنب طريقة إضافية، وهذا هو اختيارك.)

وهذا يعني أنه يمكنك الدخول إليها كما يلي:

$product->categories  

(دائما استخدام وظيفة السحر للعلاقات، انها __get () وظيفة فعليا استعلام قاعدة البيانات).

وبالنسبة لتعيين العلاقات، لا توجد طريقة تلقائية. يي لديه بعض الوظائف المساعدة لهذا على الرغم من:

$category = new Category();
// Assign attributes
$category->save();

$product = new Product();
// Assign attributes
$product->save();

$product->link('categories', $category);

تحقق من link -function لمزيد من التفاصيل. من الواضح أن هناك طرق أخرى كذلك، ولكن ذلك يعتمد على احتياجاتك.

وفقا لمعلومات إضافية:

public function actionAssignCategories($product, $categories) 
{
   $product = Product::findOne($product);

   $existingCategories = \yii\base\ArrayHelper::getColumn($product->categories, 'category_id');
   $removeCategories = array_diff($existingCategories, $categories); 
   $addCategories = array_diff($categories, $existingCategories);             

   foreach ($addCategories as $category) { 
      $category = Category::findOne($category);
      $product->link('categories', $category);
   }

   foreach ($removeCategories as $category) { 
      $category = Category::findOne($category);
      $product->unlink('categories', $category);
   }
}

لم تختبر، ولكن هذا ينبغي أن تعطيك فكرة عن كيفية معالجة هذا.


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
   }
}