За последние 24 часа нас посетили 22477 программистов и 1007 роботов. Сейчас ищут 755 программистов ...

Связь many to many

Тема в разделе "Yii", создана пользователем Allanian, 21 сен 2016.

Метки:
  1. Allanian

    Allanian Новичок

    С нами с:
    24 мар 2016
    Сообщения:
    2
    Симпатии:
    0
    Здравствуйте уважаемые форумчане, помогите решить самую известную проблему 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:
    1. <?php
    2.  
    3. namespace backend\controllers;
    4.  
    5. use Yii;
    6. use backend\models\News;
    7. use backend\models\Allnews;
    8. use backend\models\Tag;
    9. use backend\models\Img;
    10. use backend\models\Onenews;
    11. use common\models\User;
    12.  
    13. use yii\db\ActiveRecord;
    14. use \yii\db\Query;
    15. use yii\data\Pagination;
    16. use yii\data\ActiveDataProvider;
    17. use yii\web\Controller;
    18. use yii\web\UploadedFile;
    19. use yii\web\NotFoundHttpException;
    20. use yii\filters\VerbFilter;
    21. use yii\helpers\ArrayHelper;
    22.  
    23.  
    24. use yii\filters\AccessControl;
    25. use yii\web\Response;
    26. use yii\widgets\Pjax;
    27.  
    28.  
    29.  
    30.  
    31. class NewsController extends Controller
    32. {
    33.  
    34.     public function behaviors()
    35.     {
    36.         return [
    37.             'verbs' => [
    38.                 'class' => VerbFilter::className(),
    39.                 'actions' => [
    40.                     'delete' => ['POST'],
    41.                 ],
    42.             ],
    43.         ];
    44.     }
    45.  
    46.  
    47.  
    48.  
    49.     /**
    50.      * Displays a single News model.
    51.      * @param string $id
    52.      * @return mixed
    53.      */
    54.     public function actionView($id)
    55.     {
    56.         return $this->render('view', [
    57.             'model' => $this->findModel($id),
    58.         ]);
    59.     }
    60.  
    61.  
    62.     /**
    63.      * Lists all News models.
    64.      * @return mixed
    65.      */
    66.     public function actionList()
    67.     {
    68.         $dataProvider = new ActiveDataProvider([
    69.             'query' => News::find(),
    70.         ]);
    71.  
    72.         $time = date('H:i:s');
    73.         return $this->render('list', [
    74.             'time' => $time,
    75.             'dataProvider' => $dataProvider,
    76.         ]);
    77.     }
    78.  
    79.  
    80.     //Добавление новостей
    81.     public function actionCreate()
    82.     {
    83.         $model = new News();
    84.         $user = User::find()->all();
    85.         $tag = Tag::find()->all();
    86.         $img = new Img();
    87.  
    88.  
    89.         // выполняет загрузку модели
    90.        // if ($news->load(Yii::$app->request->post()) && $news->validate() & $user->validate() && $category->validate() && $img->validate()) {
    91.         if ($model->load(Yii::$app->request->post()) &&  $model->save()) {
    92.             return $this->redirect(['view', 'id' => $model->id]);
    93.            // echo $model->getAllnews()->createCommand()->rawSql;
    94. //            echo "<pre>";
    95. //            print_r(Yii::$app->request->post());
    96. //            echo "</pre>";
    97.  
    98. //           //  Блок загрузки изображения
    99. //            $file = UploadedFile::getInstance($img, 'img');   //Get the uploaded file
    100. //            $fp = fopen($file->tempName, 'r');
    101. //            //$content = fread($fp, filesize($file->tempName));
    102. //            $content = file_get_contents($file->tempName);
    103. //            fclose($fp);
    104. //            $img->img = $content;
    105. //           // $img->save();
    106. //            echo "<pre>";
    107. //           // print_r($model);
    108. //            echo "</pre>";
    109. //            $model->save();
    110.  
    111.  
    112.        //     echo "<pre>";
    113.       //  print_r($news->attributes);
    114.          //  print_r($category);
    115.          // print_r($file);
    116.        //     echo "</pre>";
    117.          //   $arrayAllnews = array();
    118.           //  $arrayAllnews = ['user' => $user, 'img' => $img, 'news'=> $news,'categorynews'=$category];
    119.  
    120.     //        return $this->redirect(['view', 'id' => $model->id]);
    121. //            $allnews->save();
    122. //            $user->save();
    123. //            $img->save();
    124. //
    125.            // return $this->redirect(['index']);
    126.        //     return $this->redirect(['view', 'id' => $news->id]);
    127.         } else {
    128.             return $this->render('create', [
    129.                 'model' => $model,
    130.                 'user' => $user,
    131.                 'tag' => $tag,
    132.                 'img' => $img,
    133.             ]);
    134.         }
    135.     }
    136.  
    137.  
    138.    
    139.  
    140.     /**
    141.      * Finds the News model based on its primary key value.
    142.      * If the model is not found, a 404 HTTP exception will be thrown.
    143.      * @param integer $id
    144.      * @return News the loaded model
    145.      * @throws NotFoundHttpException if the model cannot be found
    146.      */
    147.     protected function findModel($id)
    148.     {
    149.         if (($model = News::findOne($id)) !== null) {
    150.             return $model;
    151.         } else {
    152.             throw new NotFoundHttpException('The requested page does not exist.');
    153.         }
    154.     }
    155.  
    156.  
    157. }
    Код модели
    PHP:
    1. <?php
    2. namespace backend\models;
    3. use yii\db\ActiveRecord;
    4.  
    5. class News extends ActiveRecord
    6. {
    7.     public $current_date;    //текущая дата
    8.  
    9.     public function behaviors()
    10.     {
    11.         return [
    12.             ['class' => \voskobovich\behaviors\ManyToManyBehavior::className(),
    13.                 'relations' => [
    14.                     'user_id' => 'user',
    15.                     'tag_id' => 'tag',
    16.                     'img_id' => 'img',
    17.                 ],
    18.             ],
    19.         ];
    20.     }
    21.  
    22.     public function rules()
    23.     {
    24.         return [
    25.             [['title', 'text', 'urlPruf'], 'required'],
    26.             [['text', 'status', 'urlPruf'], 'string'],
    27.             [['hot_news'], 'integer'],
    28.             [['created_date', 'updated_date'], 'safe'],
    29.             [['title'], 'string', 'max' => 255],
    30.             [['user_id', 'tag_id','img_id'], 'each', 'rule' => ['integer']]
    31.         ];
    32.     }
    33.  
    34.     public static function tableName()
    35.     {
    36.         return '{{%news}}';
    37.     }
    38.  
    39.  
    40.     public function attributeLabels()
    41.     {
    42.         return [
    43.             'id' => 'ID',
    44.             'title' => 'Title',
    45.             'text' => 'Text',
    46.             'status' => 'Status',
    47.             'hot_news' => 'Hot News',
    48.             'urlPruf' => 'Url Pruf',
    49.             'created_date' => 'Created Date',
    50.             'updated_date' => 'Updated Date',
    51.         ];
    52.     }
    53.  
    54.  
    55.  
    56.     //для определения текущей даты
    57.     public function init(){
    58.         parent::init();
    59.         $this->current_date = date("Y-m-d H:i:s");
    60.     }
    61.  
    62.     public function getImg()
    63.     {
    64.         return $this->hasMany(Img::className(), ['id' => 'img_id'])
    65.             ->viaTable('work_allnews', ['news_id' => 'id']);
    66.     }
    67.  
    68.     public function getUser()
    69.     {
    70.         return $this->hasMany(User::className(), ['id' => 'user_id'])
    71.             ->viaTable('work_allnews', ['news_id' => 'id']);
    72.     }
    73.  
    74.    
    75.     public function getTag()
    76.     {
    77.         return $this->hasMany(Tag::className(), ['id' => 'tag_id'])
    78.             ->viaTable('work_allnews', ['news_id' => 'id']);
    79.     }
    80.  
    81.     public function getAllnews()
    82.     {
    83.         return $this->hasMany(Allnews::className(), ['news_id' => 'id','img_id' =>'id','user_id' => 'id','tag_id'=>'id']);
    84.     }
    85.  
    86.  
    87.  
    88.     public function beforeSave($insert)
    89.     {
    90.         if(parent::beforeSave($insert))
    91.         {
    92.             if($this->isNewRecord)
    93.             {
    94.                 $this->created_date = $this->updated_date = $this->current_date;
    95.             }
    96.             else
    97.                 $this->updated_date = time();
    98.             return true;
    99.         }
    100.         else
    101.             return false;
    102.     }
    103.  
    104.  
    105. }
    Код View
    PHP:
    1. <?php
    2.  
    3. use yii\helpers\Html;
    4.  
    5.  
    6. $this->title = 'Create News';
    7. $this->params['breadcrumbs'][] = ['label' => 'News', 'url' => ['index']];
    8. $this->params['breadcrumbs'][] = $this->title;
    9. ?>
    10. <div class="news-create">
    11.  
    12.     <h1><?= Html::encode($this->title) ?></h1>
    13.  
    14.     <?= $this->render('_form', [
    15.         'model'=> $model,
    16.         'user' => $user,
    17.         'tag'  => $tag,
    18.         'img'  => $img,
    19.     ]) ?>
    20. </div>

    Код самой формы
    PHP:
    1. <?php
    2.  
    3. use yii\helpers\Html;
    4. use yii\widgets\ActiveForm;
    5. use backend\models\Categorynews;
    6. use backend\models\News;
    7. use yii\helpers\ArrayHelper;
    8. /* @var $this yii\web\View */
    9. /* @var $model app\models\News */
    10. /* @var $form yii\widgets\ActiveForm */
    11.  
    12.  
    13. use backend\assets\AppAsset;
    14. use yii\bootstrap\Nav;
    15. use yii\bootstrap\NavBar;
    16. use yii\widgets\Breadcrumbs;
    17. use common\widgets\Alert;
    18.  
    19.  
    20. ?>
    21.  
    22. <div class="news-form">
    23.  
    24.     <?php
    25.  
    26. // echo  Yii::$app->user->id;
    27. //   print_r(Yii::$app->user);
    28. //   echo Yii::$app->user->identity->username;
    29.   //  echo "<pre>"; print_r($categoryNews);  echo "</pre>";
    30.     $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]) ?>
    31.  
    32.     <?= $form->field($model, 'title')->label('Заголовок новости')->textInput(['maxlength' => true]) ?>
    33.  
    34.     <?= $form->field($model, 'text')->label('Текст новости')->textarea(['rows' => 6]) ?>
    35.  
    36.     <?= $form->field($model, 'status')->label('Статус новости')->dropDownList([ 'show' => 'Show', 'hide' => 'Hide', 'wait' => 'Wait', 'ban' => 'Ban', ], ['prompt' => '']) ?>
    37.  
    38.     <?= $form->field($model, 'hot_news')->label('Важная новость')->textInput(['maxlength' => true,'value'=>'1']) ?>
    39.  
    40.     <?= $form->field($model, 'urlPruf')->label('Ссылка')->textarea(['rows' => 6]) ?>
    41.  
    42.     <?= $form->field($model, 'tag_id')->dropDownList(
    43.             ArrayHelper::map($tag, 'id', 'title'),['multiple' => true]
    44.     ) ?>
    45.  
    46.  
    47.  
    48.     <?php
    49.     foreach($user as $qwe){
    50.         if($qwe['name']=='admin'){
    51.            $userFamyly = $qwe['name'];
    52.         }
    53.     }
    54.     ?>
    55.  
    56.     <?= $form->field($model, 'user_id')->label('Пользователь')->textInput(['maxlength' => true,'value'=> $userFamyly ]) ?>
    57.  
    58. <!--    --><?//= $form->field($model, 'user_id')->dropDownList(
    59. //        ArrayHelper::map($user, 'id', 'name')
    60. //    ) ?>
    61.  
    62.  
    63. <!--    --><?//=$form->field($model, 'img_id')->fileInput() ?>
    64.  
    65.  
    66.     <div class="form-group">
    67.         <?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
    68.     </div>
    69.  
    70.     <?php ActiveForm::end(); ?>
    71.  
    72. </div>
     
  2. rybak94

    rybak94 Новичок

    С нами с:
    28 ноя 2016
    Сообщения:
    5
    Симпатии:
    1
    На первый взгляд у тебя проблемы с базой данных и со связями, почитай про нормальные формы бд, связи у тебя выставляются странно, каждое поле связываешь в getAllnews. Лучше сгенерируйте модели с помощью gii
     
  3. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    [​IMG]
     
    denis01 нравится это.