Добрый день. Есть две таблицы user и test_user, связанные через отношение в моделе TestUser : PHP: public function getUser() { return $this->hasOne(User::className(), ['id' => 'user_id']); } В контроллере создаю объект модели: $model = TestUser::find()->where(['user_id' => Yii::$app->user->id])->one(); котором присутствуют свойства из двух таблиц. Модель передаю в форму вида, но записать данные формы в БД не получается, никаких уведомлений я при этом не получаю. Убил на это два выходных. Предполагаю, что дело не в валидации данных, потому что все правила валидации я отключил для отладки. Прошу подсказать, что я делаю не так и что изменить. Дамп $model на момент передачи в вид ниже. Поля таблицы test_user : id, user_id ... Код (Text): object(app\modules\test\models\TestUser)#261 (17) { ["first_name"]=> NULL ["last_name"]=> NULL ["sex"]=> NULL ["birthday"]=> NULL ["country"]=> NULL ["locality"]=> NULL ["address"]=> NULL ["_attributes":"yii\db\BaseActiveRecord":private]=> array(10) { ["id"]=> int(1) ["user_id"]=> int(2) ["role"]=> int(1) ["marital_s"]=> int(1) ["work"]=> string(2) "33" ["about"]=> string(5) "55555" ["contacts"]=> string(4) "4444" ["image"]=> string(18) "1590963876NmOQVJ0T" ["created_at"]=> int(123) ["updated_at"]=> int(345) } ["_oldAttributes":"yii\db\BaseActiveRecord":private]=> array(10) { ["id"]=> int(1) ["user_id"]=> int(2) ["role"]=> int(1) ["marital_s"]=> int(1) ["work"]=> string(2) "33" ["about"]=> string(5) "55555" ["contacts"]=> string(4) "4444" ["image"]=> string(18) "1590963876NmOQVJ0T" ["created_at"]=> int(123) ["updated_at"]=> int(345) } ["_related":"yii\db\BaseActiveRecord":private]=> array(0) { } ["_relationsDependencies":"yii\db\BaseActiveRecord":private]=> array(0) { } ["_errors":"yii\base\Model":private]=> NULL ["_validators":"yii\base\Model":private]=> NULL ["_scenario":"yii\base\Model":private]=> string(7) "default" ["_events":"yii\base\Component":private]=> array(0) { } ["_eventWildcards":"yii\base\Component":private]=> array(0) { } ["_behaviors":"yii\base\Component":private]=> array(0) { } } Вот данные, которые приходят в Yii::$app->request->post() : Код (Text): array(2) { ["_csrf"]=> string(88) "Zh_D4I4ejoV9Moy-J5F3xpXJLi3BPJzfk9xZLRYiw9UtZ6ur4i63wjR0wOFkxzSR8Yxsb5RX7-_mqiweQUeJ5A==" ["TestUser"]=> array(4) { ["marital_s"]=> string(1) "1" ["work"]=> string(11) "11111111111" ["contacts"]=> string(10) "1111111111" ["about"]=> string(11) "11111111111" } }
А где код записи то, как записываете? Что то типо: PHP: $values = [ 'name' => 'James', 'email' => 'james@example.com', ]; $customer = new Customer(); $customer->attributes = $values; $customer->save(); --- Добавлено --- Как то так наверно без проверок: PHP: <?php $post = Yii::$app->request->post('TestUser'); $testUser = TestUser::find()->where(['user_id' => Yii::$app->user->id])->one(); $testUser->marital_s = $post['marital_s']; $testUser->work = $post['work']; $testUser->contacts = $post['contacts']; $testUser->about = $post['about']; $testUser->save();
Я смог добиться записи с помощью конструкции вида: Код (Text): if ($model->load(Yii::$app->request->post()) ) { $request = Yii::$app->request; $testUserId = TestUser::findOne(['user_id' => Yii::$app->user->id]); $testUserId->marital_s = $request->getBodyParam('UserProfileForm')["marital_s"]; $testUserId->work = $request->getBodyParam('UserProfileForm')["work"]; $testUserId->contacts = $request->getBodyParam('UserProfileForm')["contacts"]; $testUserId->about = $request->getBodyParam('UserProfileForm')["about"]; $testUserId->save(); return $this->redirect(['update', true]); } Но тут сразу несколько проблем: мне это кажется ужасным кодом и неиспользованием встроенного (как я думаю) функционала. Разве Yii автоматически не должен сам "подхватить" данные из формы и внести их в БД?
А вот так не сработает ли, я сам не проверял, времени жалко) PHP: $request = $request->post('TestUser'); if ($model->load( $request ) ) { $testUserId = TestUser::findOne(['user_id' => Yii::$app->user->id]); $testUserId->attributes = $request; $testUserId->save(); } --- Добавлено --- В документации просто прописана такая штука PHP: $model = new \app\models\ContactForm; $model->attributes = \Yii::$app->request->post('ContactForm'); Почитайте сами https://yiiframework.com.ua/ru/doc/guide/2/structure-models/ --- Добавлено --- Я так понимаю чтобы это работало, вам надо добавить вот это в модели: PHP: public function rules() { return [ [['marital_s', 'work ', 'contacts', 'about'], 'safe'], ]; }
Частично получилось, атрибуты инициируются если сделать так при условии с safe в правилах проверки: PHP: $model = new \app\modules\test\models\forms\UserProfileForm; $model->attributes = \Yii::$app->request->post('TestUser'); Но вызов $model->save(); вызывает ошибку: Calling unknown method: app\modules\test\models\forms\UserProfileForm::save(). В документации не смог найти, как привязать запись к конкретному id пользователя в данном случае. Явно присваивать атрибут id пользователя? Изначальное решение не работает, наполнения атрибутов значениями не происходит: PHP: $model = TestUser::find()->where(['user_id' => Yii::$app->user->id])->one(); $model->attributes = \Yii::$app->request->post('TestUser');
Код выше обрабатывается в контроллере, вот он: class UserController extends \yii\web\Controller Строка use yii\db\ActiveRecord; присутствует, но не используется ничем в коде. Модель TestUser: PHP: <?php namespace app\modules\test\models; use Yii; use app\models\User; use yii\db\ActiveRecord; /** * This is the model class for table "test_user". * * @property int $id * @property int $user_id Пользователь * @property int $role Роль и права доступа * @property string $marital_s Семейный статус * @property string $work Работа * @property string $about О себе * @property string $contacts Контакты * @property string $image Изображение пользователя * @property int $created_at Дата создания записи * @property int $updated_at Дата изменения записи */ class TestUser extends \yii\db\ActiveRecord { public $first_name; public $last_name; public $sex; public $birthday; public $country; public $locality; public $address; public function getUser() { return $this->hasOne(User::className(), ['id' => 'user_id']); } /** * {@inheritdoc} */ public static function tableName() { return 'test_user'; } /** * {@inheritdoc} */ public function rules() { return [ // [['user_id'], 'required'], // [['user_id', 'role', 'marital_s', 'created_at', 'updated_at'], 'integer'], // [['work', 'about', 'contacts', 'image'], 'string', 'max' => 50], ]; } /** * {@inheritdoc} */ public function attributeLabels() { return [ ]; } }