name вместо id

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
dymsonn
Сообщения: 77
Зарегистрирован: 2018.06.13, 15:37

name вместо id

Сообщение dymsonn »

Здравствуйте. ситуация следующая. есть две таблицы one(id, name, id_two) и two(id, name). Связаны соответственно по id_two. Код сгенерирован gii. Так вот во вьюшке относящейся к one нужно добавить новое значение, а поле

Код: Выделить всё

<?= $form->field($model, 'id_two')->textInput() ?>
требует id. А мне нужно, что бы я в это поле ввел name для таблицы two и при операции добавления в поле one(id_two) записался новый id из таблицы two.
rules() уже подправил, не ругается. Не могу осуществить подмену полей.
dymsonn
Сообщения: 77
Зарегистрирован: 2018.06.13, 15:37

Re: name вместо id

Сообщение dymsonn »

Или может тут нужно как то редиректить в TwoController и через него добавлять новые значения? Там же эта процедура есть. К сожаления, пока не знаю как обращаться к другим контроллерам и моделям.
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: name вместо id

Сообщение andku83 »

Раз вам пока такое сложно сделайте вариант попроще:
В twoController предварительно создавайте записи для two, а на месте вашего инпут поставьте дропдаун со списком ранее созданных two.
dymsonn
Сообщения: 77
Зарегистрирован: 2018.06.13, 15:37

Re: name вместо id

Сообщение dymsonn »

andku83 писал(а): 2018.07.13, 02:07 Раз вам пока такое сложно сделайте вариант попроще
А как же борьба с трудностями, а как же освоение нового!? :ugeek:
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: name вместо id

Сообщение andku83 »

А вы уже простым вариантов реализовали? Любое изучение нового начинается с простых вещей...
masson
Сообщения: 545
Зарегистрирован: 2012.07.03, 15:59

Re: name вместо id

Сообщение masson »

А как вы собираетесь добавлять запись в one, для которой id_two уже существует? textInput тут совсем не в тему.
Я бы для id_two сделал селект и рядом кнопочка со знаком "+". Если соответствующая запись в two уже существует - выбираем из селекта. А если нет - жмем на плюс и всплывает модалка с textInput, потом аяксом добавляем новую запись в two и обновляем селект.
Аватара пользователя
proctoleha
Сообщения: 298
Зарегистрирован: 2016.07.10, 19:00

Re: name вместо id

Сообщение proctoleha »

Можно и с инпутом текст.
1. В модели добавляете публичное поле, например, nameInputTwo. Прописываете его в rule's и атрибутах, выводите в виде text input в представлении
2. В контроллере, в экшене, который принимает форму, пытаетесь найти запись в таблице two по имени, которое было записано в поле nameInputTwo. Если запись найдена, берем из нее id, иначе выкидываем исключение (добавляем ошибку в модель).
Вот за что я не люблю линукс, так это за свои кривые, временами, руки
masson
Сообщения: 545
Зарегистрирован: 2012.07.03, 15:59

Re: name вместо id

Сообщение masson »

proctoleha писал(а): 2018.07.14, 10:08 Можно и с инпутом текст.
1. В модели добавляете публичное поле, например, nameInputTwo. Прописываете его в rule's и атрибутах, выводите в виде text input в представлении
2. В контроллере, в экшене, который принимает форму, пытаетесь найти запись в таблице two по имени, которое было записано в поле nameInputTwo. Если запись найдена, берем из нее id, иначе выкидываем исключение (добавляем ошибку в модель).
При этом только надо не забыть обязать всех юзеров периодически запоминать наизусть содержание таблицы two вплоть до регистров, порядка слов, запятых итд. А еще написать им инструкцию что им делать в случае исключений :?
dymsonn
Сообщения: 77
Зарегистрирован: 2018.06.13, 15:37

Re: name вместо id

Сообщение dymsonn »

masson писал(а): 2018.07.14, 11:44 При этом только надо не забыть обязать всех юзеров периодически запоминать наизусть содержание таблицы two вплоть до регистров, порядка слов, запятых итд.
Нюансы можно опустить. И считать, что каждая новая запись Новая. К катастрофе же это не приведет?
dymsonn
Сообщения: 77
Зарегистрирован: 2018.06.13, 15:37

Re: name вместо id

Сообщение dymsonn »

Реализовал, кому интересно
public function actionCreate()
{
$model = new One();
$modeltwo = new Two();

if ($model->load(Yii::$app->request->post()))
{
$modeltwo->name = $_POST['One']['id_two'];
$modeltwo->save();
$model->id_two = $modeltwo->id;
$model->save();

return $this->redirect(['view', 'id' => $model->id]);
}

return $this->render('create', [
'model' => $model,

]);
}
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: name вместо id

Сообщение Alexum »

Несколько советов:
1) Уделите больше времени документации https://www.yiiframework.com/doc/guide/2.0/ru.
2) Если у вас ActiveRecord, то не трогайте поля из БД, не ломайте их валидацию, не пытайтесь запихнуть туда что-то для них не предназначенное. Это скользкий путь. Всегда можно добавить вспомогательное свойство в класс модели и использовать его для формы. В будущем познакомитесь как из одной формы заполнять данные для нескольких моделей.
3) Сохранение модели всегда осуществляйте с проверкой результата. У вас может сохранение не осуществлено а вы летите дальше.

Код: Выделить всё

if(!$model->save()){
	// Шеф, у нас проблемы, что делать?
}
4) Любые множественные операции, где осуществляется сохранение нескольких связанных моделей осуществляйте через транзакции (чтобы в случае ошибки записи откатились все действия). https://www.yiiframework.com/doc/guide/ ... operations
Ответить