Страница 1 из 1

Вопросы

Добавлено: 2015.01.06, 15:46
karpo518
1. В Yii 2 нет валидации и сохранения связанных моделей из коробки?
2. Пропал CForm. Есть ли альтернатива?
3. Есть 2 связанные модели. Создаем два новых объекта, связываем через link. Link в доках обещает сохранить модель, которую привязываем, чтобы зафиксировать связь. Ок. Сохраняем модели, но выясняется, что поле, используемое в качестве внешнего ключа, не заполнено. Ладно, справедливо, ведь link сохраняет привязываемую модель, а внешний ключ хранится в основной. Тогда меняю местами модели, линкую и сохраняю по обратной связи. Тот же результат:

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

Unable to link models: the primary key of app\models\Item is null.
 
Где логика? Что же мне сохранять, потом линковать, потом опять сохранять модели? Объясните.

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

public function actionCreate()
    {
        $item = new Item();
        
        $seo = new Seo();


        if ($item->load(Yii::$app->request->post()) &&
            $seo->load(Yii::$app->request->post()) &&
            $item->validate() && 
            $seo->validate()) 
        {
            $seo->link('item', $item);
            $seo->item->save(false);
            return $this->redirect(['view', 'id' => $item->id]);
        }
......
class Item extends \yii\db\ActiveRecord
{
    public function getSeo()
    {
        return $this->hasOne(Seo::className(), ['item_id' => 'id']);
    }
......


class Seo extends \yii\db\ActiveRecord
{
    public function getItem()
    {
        return $this->hasOne(Item::className(), ['id' => 'item_id']);
    }
......
 

Re: Вопросы

Добавлено: 2015.01.06, 17:24
anton44eg
думаю нужно

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

$seo->save(false);
 
или

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

$seo->save(false);
$seo->item->save(false);
 
В любом случае MySQL не может в 2 таблицы 1 запросом сохранять
А сохранять сначала зависимую модель, а потом главную - даже по логике странно

Re: Вопросы

Добавлено: 2015.01.06, 17:27
norvele
И еще лучше использовать транзакции когда нужно сохранять несколько записей сразу.
По 2 вопросу: CForm теперь просто Model

Re: Вопросы

Добавлено: 2015.01.06, 17:30
TranceSmile
1. Из коробки нет.
2. просто Model

Re: Вопросы

Добавлено: 2015.01.06, 18:05
zelenin
anton44eg писал(а):думаю нужно

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

$seo->save(false);
или

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

$seo->save(false);
$seo->item->save(false);
save(false) - отключение валидации при сохранении. А тут нет ошибок валидации.
anton44eg писал(а): В любом случае MySQL не может в 2 таблицы 1 запросом сохранять
но автор и не говорил об одном запросе

Re: Вопросы

Добавлено: 2015.01.06, 18:06
anton44eg
zelenin писал(а):
anton44eg писал(а):думаю нужно

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

$seo->save(false);
 
или

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

$seo->save(false);
$seo->item->save(false);
 
save(false) - отключение валидации при сохранении. А тут нет ошибок валидации.
anton44eg писал(а): В любом случае MySQL не может в 2 таблицы 1 запросом сохранять
но автор и не говорил об одном запросе
вы вообще читаете пост?

Re: Вопросы

Добавлено: 2015.01.06, 18:10
zelenin
anton44eg писал(а):
zelenin писал(а):
anton44eg писал(а):думаю нужно

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

$seo->save(false);
или

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

$seo->save(false);
$seo->item->save(false);
save(false) - отключение валидации при сохранении. А тут нет ошибок валидации.
anton44eg писал(а): В любом случае MySQL не может в 2 таблицы 1 запросом сохранять
но автор и не говорил об одном запросе
вы вообще читаете пост?
а что я ответил также как и вы вне контекста вопроса?

Re: Вопросы

Добавлено: 2015.01.06, 18:49
anton44eg
zelenin писал(а): а что я ответил также как и вы вне контекста вопроса?
у человека проблема с link и сохранение, я объяснил, как сохранить и почему не работает

Re: Вопросы

Добавлено: 2015.01.06, 18:53
zelenin
anton44eg писал(а):
zelenin писал(а): а что я ответил также как и вы вне контекста вопроса?
у человека проблема с link и сохранение, я объяснил, как сохранить и почему не работает
как мы видим из кода, save(false) автору уже знакомо. Вопрос заключался как правильно линковать модели, а не как сохранить две модели.

Re: Вопросы

Добавлено: 2015.01.06, 23:51
karpo518
2. Извиняюсь, не уточнил. Имелась ввиду возможность генерации верстки формы из скелета в виде массива.
3. Почитал примеры. Разобрался. Линковать можно только к сохраненной модели. Сохранять привязываемую модель не требуется. Код короток и ясен:

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

            $seo->save(false);
            $seo->link('item', $item);