За последние 24 часа нас посетили 20690 программистов и 1010 роботов. Сейчас ищут 388 программистов ...

Не происходит запись данных в БД

Тема в разделе "Yii", создана пользователем 118_64, 1 июн 2020.

  1. 118_64

    118_64 Активный пользователь

    С нами с:
    8 янв 2015
    Сообщения:
    84
    Симпатии:
    2
    Добрый день. Есть две таблицы user и test_user, связанные через отношение в моделе TestUser :

    PHP:
    1.  public function getUser()
    2. {
    3. return $this->hasOne(User::className(), ['id' => 'user_id']);
    4. }
    В контроллере создаю объект модели: $model = TestUser::find()->where(['user_id' => Yii::$app->user->id])->one(); котором присутствуют свойства из двух таблиц.

    Модель передаю в форму вида, но записать данные формы в БД не получается, никаких уведомлений я при этом не получаю. Убил на это два выходных. Предполагаю, что дело не в валидации данных, потому что все правила валидации я отключил для отладки. Прошу подсказать, что я делаю не так и что изменить. Дамп $model на момент передачи в вид ниже. Поля таблицы test_user : id, user_id ...

    Код (Text):
    1. object(app\modules\test\models\TestUser)#261 (17) {
    2.   ["first_name"]=>
    3.   NULL
    4.   ["last_name"]=>
    5.   NULL
    6.   ["sex"]=>
    7.   NULL
    8.   ["birthday"]=>
    9.   NULL
    10.   ["country"]=>
    11.   NULL
    12.   ["locality"]=>
    13.   NULL
    14.   ["address"]=>
    15.   NULL
    16.   ["_attributes":"yii\db\BaseActiveRecord":private]=>
    17.   array(10) {
    18.     ["id"]=>
    19.     int(1)
    20.     ["user_id"]=>
    21.     int(2)
    22.     ["role"]=>
    23.     int(1)
    24.     ["marital_s"]=>
    25.     int(1)
    26.     ["work"]=>
    27.     string(2) "33"
    28.     ["about"]=>
    29.     string(5) "55555"
    30.     ["contacts"]=>
    31.     string(4) "4444"
    32.     ["image"]=>
    33.     string(18) "1590963876NmOQVJ0T"
    34.     ["created_at"]=>
    35.     int(123)
    36.     ["updated_at"]=>
    37.     int(345)
    38.   }
    39.   ["_oldAttributes":"yii\db\BaseActiveRecord":private]=>
    40.   array(10) {
    41.     ["id"]=>
    42.     int(1)
    43.     ["user_id"]=>
    44.     int(2)
    45.     ["role"]=>
    46.     int(1)
    47.     ["marital_s"]=>
    48.     int(1)
    49.     ["work"]=>
    50.     string(2) "33"
    51.     ["about"]=>
    52.     string(5) "55555"
    53.     ["contacts"]=>
    54.     string(4) "4444"
    55.     ["image"]=>
    56.     string(18) "1590963876NmOQVJ0T"
    57.     ["created_at"]=>
    58.     int(123)
    59.     ["updated_at"]=>
    60.     int(345)
    61.   }
    62.   ["_related":"yii\db\BaseActiveRecord":private]=>
    63.   array(0) {
    64.   }
    65.   ["_relationsDependencies":"yii\db\BaseActiveRecord":private]=>
    66.   array(0) {
    67.   }
    68.   ["_errors":"yii\base\Model":private]=>
    69.   NULL
    70.   ["_validators":"yii\base\Model":private]=>
    71.   NULL
    72.   ["_scenario":"yii\base\Model":private]=>
    73.   string(7) "default"
    74.   ["_events":"yii\base\Component":private]=>
    75.   array(0) {
    76.   }
    77.   ["_eventWildcards":"yii\base\Component":private]=>
    78.   array(0) {
    79.   }
    80.   ["_behaviors":"yii\base\Component":private]=>
    81.   array(0) {
    82.   }
    83. }
    Вот данные, которые приходят в Yii::$app->request->post() :
    Код (Text):
    1. array(2) {
    2.   ["_csrf"]=>
    3.   string(88) "Zh_D4I4ejoV9Moy-J5F3xpXJLi3BPJzfk9xZLRYiw9UtZ6ur4i63wjR0wOFkxzSR8Yxsb5RX7-_mqiweQUeJ5A=="
    4.   ["TestUser"]=>
    5.   array(4) {
    6.     ["marital_s"]=>
    7.     string(1) "1"
    8.     ["work"]=>
    9.     string(11) "11111111111"
    10.     ["contacts"]=>
    11.     string(10) "1111111111"
    12.     ["about"]=>
    13.     string(11) "11111111111"
    14.   }
    15. }
     
    #1 118_64, 1 июн 2020
    Последнее редактирование: 1 июн 2020
  2. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    А где код записи то, как записываете?
    Что то типо:
    PHP:
    1. $values = [
    2.     'name' => 'James',
    3.     'email' => 'james@example.com',
    4. ];
    5.  
    6. $customer = new Customer();
    7.  
    8. $customer->attributes = $values;
    9. $customer->save();
    --- Добавлено ---
    Как то так наверно без проверок:
    PHP:
    1. <?php
    2.  
    3. $post = Yii::$app->request->post('TestUser');
    4. $testUser = TestUser::find()->where(['user_id' => Yii::$app->user->id])->one();
    5.  
    6. $testUser->marital_s = $post['marital_s'];
    7. $testUser->work = $post['work'];
    8. $testUser->contacts = $post['contacts'];
    9. $testUser->about = $post['about'];
    10.  
    11. $testUser->save();
     
    118_64 нравится это.
  3. 118_64

    118_64 Активный пользователь

    С нами с:
    8 янв 2015
    Сообщения:
    84
    Симпатии:
    2
    Я смог добиться записи с помощью конструкции вида:

    Код (Text):
    1. if ($model->load(Yii::$app->request->post()) ) {
    2.     $request = Yii::$app->request;
    3.     $testUserId = TestUser::findOne(['user_id' => Yii::$app->user->id]);
    4.     $testUserId->marital_s = $request->getBodyParam('UserProfileForm')["marital_s"];
    5.     $testUserId->work = $request->getBodyParam('UserProfileForm')["work"];
    6.     $testUserId->contacts = $request->getBodyParam('UserProfileForm')["contacts"];
    7.     $testUserId->about = $request->getBodyParam('UserProfileForm')["about"];
    8.     $testUserId->save();        
    9.     return $this->redirect(['update', true]);
    10. }
    Но тут сразу несколько проблем: мне это кажется ужасным кодом и неиспользованием встроенного (как я думаю) функционала. Разве Yii автоматически не должен сам "подхватить" данные из формы и внести их в БД?
     
  4. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Само ничего не происходит, надо все программировать. А вашем коде просто нужно убрать дубли.
     
    118_64 нравится это.
  5. 118_64

    118_64 Активный пользователь

    С нами с:
    8 янв 2015
    Сообщения:
    84
    Симпатии:
    2
    Спасибо за ответ! Про дубли не понял.
     
  6. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    А вот так не сработает ли, я сам не проверял, времени жалко)
    PHP:
    1. $request = $request->post('TestUser');
    2.  
    3. if ($model->load( $request ) ) {
    4.  
    5.     $testUserId = TestUser::findOne(['user_id' => Yii::$app->user->id]);
    6.  
    7.     $testUserId->attributes = $request;
    8.  
    9.     $testUserId->save();
    10. }
    --- Добавлено ---
    В документации просто прописана такая штука
    PHP:
    1. $model = new \app\models\ContactForm;
    2. $model->attributes = \Yii::$app->request->post('ContactForm');
    Почитайте сами
    https://yiiframework.com.ua/ru/doc/guide/2/structure-models/
    --- Добавлено ---
    Я так понимаю чтобы это работало, вам надо добавить вот это в модели:
    PHP:
    1. public function rules()
    2. {
    3.     return [
    4.         [['marital_s', 'work ', 'contacts', 'about'], 'safe'],
    5.     ];
    6. }
     
    118_64 нравится это.
  7. 118_64

    118_64 Активный пользователь

    С нами с:
    8 янв 2015
    Сообщения:
    84
    Симпатии:
    2
    Частично получилось, атрибуты инициируются если сделать так при условии с safe в правилах проверки:
    PHP:
    1. $model = new \app\modules\test\models\forms\UserProfileForm;
    2. $model->attributes = \Yii::$app->request->post('TestUser');

    Но вызов $model->save(); вызывает ошибку: Calling unknown method: app\modules\test\models\forms\UserProfileForm::save().

    В документации не смог найти, как привязать запись к конкретному id пользователя в данном случае. Явно присваивать атрибут id пользователя? Изначальное решение не работает, наполнения атрибутов значениями не происходит:
    PHP:
    1. $model = TestUser::find()->where(['user_id' => Yii::$app->user->id])->one();
    2. $model->attributes = \Yii::$app->request->post('TestUser');
     
  8. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    покажите ваш класс, он наследует ActiveRecord?
     
  9. 118_64

    118_64 Активный пользователь

    С нами с:
    8 янв 2015
    Сообщения:
    84
    Симпатии:
    2
    Код выше обрабатывается в контроллере, вот он: class UserController extends \yii\web\Controller
    Строка use yii\db\ActiveRecord; присутствует, но не используется ничем в коде.

    Модель TestUser:
    PHP:
    1. <?php
    2.  
    3. namespace app\modules\test\models;
    4.  
    5. use Yii;
    6. use app\models\User;
    7. use yii\db\ActiveRecord;
    8.  
    9.  
    10. /**
    11. * This is the model class for table "test_user".
    12. *
    13. * @property int $id
    14. * @property int $user_id Пользователь
    15. * @property int $role Роль и права доступа
    16. * @property string $marital_s Семейный статус
    17. * @property string $work Работа
    18. * @property string $about О себе
    19. * @property string $contacts Контакты
    20. * @property string $image Изображение пользователя
    21. * @property int $created_at Дата создания записи
    22. * @property int $updated_at Дата изменения записи
    23. */
    24. class TestUser extends \yii\db\ActiveRecord
    25. {
    26.     public $first_name;
    27.     public $last_name;
    28.     public $sex;
    29.     public $birthday;
    30.     public $country;
    31.     public $locality;
    32.     public $address;
    33.  
    34.  
    35.     public function getUser()
    36.     {
    37.         return $this->hasOne(User::className(), ['id' => 'user_id']);
    38.     }
    39.  
    40.  
    41.     /**
    42.      * {@inheritdoc}
    43.      */
    44.     public static function tableName()
    45.     {
    46.         return 'test_user';
    47.     }
    48.  
    49.     /**
    50.      * {@inheritdoc}
    51.      */
    52.     public function rules()
    53.     {
    54.         return [
    55.             // [['user_id'], 'required'],
    56.             // [['user_id', 'role', 'marital_s', 'created_at', 'updated_at'], 'integer'],
    57.             // [['work', 'about', 'contacts', 'image'], 'string', 'max' => 50],
    58.          ];
    59.     }
    60.  
    61.     /**
    62.      * {@inheritdoc}
    63.      */
    64.     public function attributeLabels()
    65.     {
    66.         return [
    67.  
    68.         ];
    69.  
    70.     }
    71. }