Здравствуйте уважаемые форумчане, помогите решить самую известную проблему yii2, http://prnt.sc/cdxvss - ссылка на uml схему Пытаюсь реализовать сохранение в связанную таблицу work_allnews - 4 поля, подцепляет только tag_id, проблема с user_id и img_id. Использовал модуль https://github.com/voskobovich/yii2-many-to-many-behavior, но почему то с user_id проблема не подцепляет его и выдает ошибку Cannot add or update a child row: a foreign key constraint fails (`yiiwork`.`work_allnews`, CONSTRAINT `FK_user` FOREIGN KEY (`user_id`) REFERENCES `work_user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE) Код контроллера PHP: <?php namespace backend\controllers; use Yii; use backend\models\News; use backend\models\Allnews; use backend\models\Tag; use backend\models\Img; use backend\models\Onenews; use common\models\User; use yii\db\ActiveRecord; use \yii\db\Query; use yii\data\Pagination; use yii\data\ActiveDataProvider; use yii\web\Controller; use yii\web\UploadedFile; use yii\web\NotFoundHttpException; use yii\filters\VerbFilter; use yii\helpers\ArrayHelper; use yii\filters\AccessControl; use yii\web\Response; use yii\widgets\Pjax; class NewsController extends Controller { public function behaviors() { return [ 'verbs' => [ 'class' => VerbFilter::className(), 'actions' => [ 'delete' => ['POST'], ], ], ]; } /** * Displays a single News model. * @param string $id * @return mixed */ public function actionView($id) { return $this->render('view', [ 'model' => $this->findModel($id), ]); } /** * Lists all News models. * @return mixed */ public function actionList() { $dataProvider = new ActiveDataProvider([ 'query' => News::find(), ]); $time = date('H:i:s'); return $this->render('list', [ 'time' => $time, 'dataProvider' => $dataProvider, ]); } //Добавление новостей public function actionCreate() { $model = new News(); $user = User::find()->all(); $tag = Tag::find()->all(); $img = new Img(); // выполняет загрузку модели // if ($news->load(Yii::$app->request->post()) && $news->validate() & $user->validate() && $category->validate() && $img->validate()) { if ($model->load(Yii::$app->request->post()) && $model->save()) { return $this->redirect(['view', 'id' => $model->id]); // echo $model->getAllnews()->createCommand()->rawSql; // echo "<pre>"; // print_r(Yii::$app->request->post()); // echo "</pre>"; // // Блок загрузки изображения // $file = UploadedFile::getInstance($img, 'img'); //Get the uploaded file // $fp = fopen($file->tempName, 'r'); // //$content = fread($fp, filesize($file->tempName)); // $content = file_get_contents($file->tempName); // fclose($fp); // $img->img = $content; // // $img->save(); // echo "<pre>"; // // print_r($model); // echo "</pre>"; // $model->save(); // echo "<pre>"; // print_r($news->attributes); // print_r($category); // print_r($file); // echo "</pre>"; // $arrayAllnews = array(); // $arrayAllnews = ['user' => $user, 'img' => $img, 'news'=> $news,'categorynews'=$category]; // return $this->redirect(['view', 'id' => $model->id]); // $allnews->save(); // $user->save(); // $img->save(); // // return $this->redirect(['index']); // return $this->redirect(['view', 'id' => $news->id]); } else { return $this->render('create', [ 'model' => $model, 'user' => $user, 'tag' => $tag, 'img' => $img, ]); } } /** * Finds the News model based on its primary key value. * If the model is not found, a 404 HTTP exception will be thrown. * @param integer $id * @return News the loaded model * @throws NotFoundHttpException if the model cannot be found */ protected function findModel($id) { if (($model = News::findOne($id)) !== null) { return $model; } else { throw new NotFoundHttpException('The requested page does not exist.'); } } } Код модели PHP: <?php namespace backend\models; use yii\db\ActiveRecord; class News extends ActiveRecord { public $current_date; //текущая дата public function behaviors() { return [ ['class' => \voskobovich\behaviors\ManyToManyBehavior::className(), 'relations' => [ 'user_id' => 'user', 'tag_id' => 'tag', 'img_id' => 'img', ], ], ]; } public function rules() { return [ [['title', 'text', 'urlPruf'], 'required'], [['text', 'status', 'urlPruf'], 'string'], [['hot_news'], 'integer'], [['created_date', 'updated_date'], 'safe'], [['title'], 'string', 'max' => 255], [['user_id', 'tag_id','img_id'], 'each', 'rule' => ['integer']] ]; } 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 init(){ parent::init(); $this->current_date = date("Y-m-d H:i:s"); } public function getImg() { return $this->hasMany(Img::className(), ['id' => 'img_id']) ->viaTable('work_allnews', ['news_id' => 'id']); } public function getUser() { return $this->hasMany(User::className(), ['id' => 'user_id']) ->viaTable('work_allnews', ['news_id' => 'id']); } public function getTag() { return $this->hasMany(Tag::className(), ['id' => 'tag_id']) ->viaTable('work_allnews', ['news_id' => 'id']); } public function getAllnews() { return $this->hasMany(Allnews::className(), ['news_id' => 'id','img_id' =>'id','user_id' => 'id','tag_id'=>'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; } } Код View PHP: <?php use yii\helpers\Html; $this->title = 'Create News'; $this->params['breadcrumbs'][] = ['label' => 'News', 'url' => ['index']]; $this->params['breadcrumbs'][] = $this->title; ?> <div class="news-create"> <h1><?= Html::encode($this->title) ?></h1> <?= $this->render('_form', [ 'model'=> $model, 'user' => $user, 'tag' => $tag, 'img' => $img, ]) ?> </div> Код самой формы PHP: <?php use yii\helpers\Html; use yii\widgets\ActiveForm; use backend\models\Categorynews; use backend\models\News; use yii\helpers\ArrayHelper; /* @var $this yii\web\View */ /* @var $model app\models\News */ /* @var $form yii\widgets\ActiveForm */ use backend\assets\AppAsset; use yii\bootstrap\Nav; use yii\bootstrap\NavBar; use yii\widgets\Breadcrumbs; use common\widgets\Alert; ?> <div class="news-form"> <?php // echo Yii::$app->user->id; // print_r(Yii::$app->user); // echo Yii::$app->user->identity->username; // echo "<pre>"; print_r($categoryNews); echo "</pre>"; $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]) ?> <?= $form->field($model, 'title')->label('Заголовок новости')->textInput(['maxlength' => true]) ?> <?= $form->field($model, 'text')->label('Текст новости')->textarea(['rows' => 6]) ?> <?= $form->field($model, 'status')->label('Статус новости')->dropDownList([ 'show' => 'Show', 'hide' => 'Hide', 'wait' => 'Wait', 'ban' => 'Ban', ], ['prompt' => '']) ?> <?= $form->field($model, 'hot_news')->label('Важная новость')->textInput(['maxlength' => true,'value'=>'1']) ?> <?= $form->field($model, 'urlPruf')->label('Ссылка')->textarea(['rows' => 6]) ?> <?= $form->field($model, 'tag_id')->dropDownList( ArrayHelper::map($tag, 'id', 'title'),['multiple' => true] ) ?> <?php foreach($user as $qwe){ if($qwe['name']=='admin'){ $userFamyly = $qwe['name']; } } ?> <?= $form->field($model, 'user_id')->label('Пользователь')->textInput(['maxlength' => true,'value'=> $userFamyly ]) ?> <!-- --><?//= $form->field($model, 'user_id')->dropDownList( // ArrayHelper::map($user, 'id', 'name') // ) ?> <!-- --><?//=$form->field($model, 'img_id')->fileInput() ?> <div class="form-group"> <?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?> </div> <?php ActiveForm::end(); ?> </div>
На первый взгляд у тебя проблемы с базой данных и со связями, почитай про нормальные формы бд, связи у тебя выставляются странно, каждое поле связываешь в getAllnews. Лучше сгенерируйте модели с помощью gii