@Allanian

Как реализовать сохранение в Yii2 Many to many?

Приветствую всех.
Малость не понимаю как реализовать в yii2 правильно сохранение через связанную таблицу
Сколько не пытался, получалось только реализовать это через beforesafe и через foreach сохранять поочереди. Должен же быть способ правильнее.

Интересует правильно ли я описываю модель Новости и как должна работать функция контроллера
public function actionCreate()
    {
        $news = new News();
        $user = new User();
        $category = Categorynews::find()->all();

        $img = new Img();
        $allnews = new Allnews();
        // выполняет загрузку модели
        // if ($news->load(Yii::$app->request->post()) && $news->validate() & $user->validate() && $category->validate() && $img->validate()) {
        if ($news->load(Yii::$app->request->post())) {
            // Блок загрузки изображения
            $file = UploadedFile::getInstance($img, 'image');   //Get the uploaded file
            //  $fp = fopen($file->tempName, 'r');
            //$content = fread($fp, filesize($file->tempName));
            //   $content = file_get_contents($file->tempName);
            //    fclose($fp);
            //     $img->image = $content;
            
            $news->save();

        } else {
            return $this->render('create', [
                'news' => $news,
                'user' => $user,
                'category' => $category,
                'img' => $img,
                'allnews' => $allnews,
            ]);
        }
    }


Есть 5 таблиц
Авторы,Картинки,Тэги,Новости,НовостиКартинкиТэгиАвторы (в ней ID всех таблиц)
Во всех моделях код идентичный следующему
<?php

namespace backend\models;

use Yii;

class Img extends \yii\db\ActiveRecord
{

    public static function tableName()
    {
        return '{{%img}}';
    }

    public function rules()
    {
        return [
            [['img'], 'required'],
            [['img'], 'string'],
        ];
    }

    public function attributeLabels()
    {
        return [
            'id' => 'id',
            'img' => 'Img',
        ];
    }

    public function getAllnews()
    {
        return $this->hasMany(Allnews::className(), ['id_img' => 'id']);
    }
}

Модель Новости
<?php

namespace backend\models;

use yii\db\ActiveRecord;

class News extends ActiveRecord
{
    public $current_date;    //текущая дата
    public $queryCategory;   //список категорий
    
    public function rules()
    {
        return [
            [['text','title','status','hot_news'], 'required','message' => 'Поле не должно быть пустым'],    //являются обязательными и не должны быть пустыми
            [['created_date', 'updated_date'], 'safe'],
            [['category_list'], 'safe']
        ];
    }
    
    //для определения текущей даты
    public function init(){
        parent::init();
        $this->current_date = date("Y-m-d H:i:s");
    }
    
    
    public static function tableName()
    {
        return '{{%news}}';
    }


    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'title' => 'Title',
            'text' => 'Text',
            'status' => 'Status',
            'hot_news' => 'Hot News',
            'urlPruf' => 'Url Pruf',
            'created_date' => 'Created Date',
            'updated_date' => 'Updated Date',
        ];
    }


    public function getImg()
    {
        return $this->hasMany(News::className(), ['id' => 'id_img'])
            ->viaTable('work_allnews', ['id_img' => 'id']);
    }

    public function getUser()
    {
        return $this->hasMany(News::className(), ['id' => 'id_user'])
            ->viaTable('work_allnews', ['id_user' => 'id']);
    }

    
    public function getCategoryNews()
    {
        return $this->hasMany(News::className(), ['id' => 'id_category'])
            ->viaTable('work_allnews', ['id_category' => 'id']);
    }

    public function getNews()
    {
        return $this->hasMany(News::className(), ['id' => 'id_news'])
            ->viaTable('work_allnews', ['id_news' => 'id']);
    }
    
    
    public function beforeSave($insert)
    {
        if(parent::beforeSave($insert))
        {
            if($this->isNewRecord)
            {
                $this->created_date = $this->updated_date = $this->current_date;
            }
            else
                $this->updated_date = time();
            return true;
        }
        else
            return false;
    }
    
}
  • Вопрос задан
  • 186 просмотров
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы