сохранить в связующую таблицу

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

сохранить в связующую таблицу

Сообщение dvs »

Есть три таблицы:
client_firm(id,name,inn)
client_face(id,name1,name2,name3,phone)
client_face_x_client_firm(id, client_face_id,client_firm_id) с внешними ключами
В моделях есть связи:
ClientFace

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

    public function getFaceFirms()
    {
        return $this->hasMany(ClientFaceXClientFirm::className(), ['client_face_id' => 'id']);
    }

    public function getFirms()
    {
        return $this->hasMany(ClientFirm::className(), ['id' => 'client_firm_id'])->via('faceFirms');
    }
ClientFaceXClientFirm

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

    public function getFirm()
    {
        return $this->hasOne(ClientFirm::className(), ['id' => 'client_firm_id']);
    }
    
    public function getFace()
    {
        return $this->hasOne(ClientFace::className(), ['id' => 'client_face_id']);
    }
Из просмотра фирмы создаю ссылку на создание контактного лица и передаю get параметр ?firm=2 для записи в связующую таблицу. Как теперь в actionCreate создать запись в связующую таблицу? Совсем запутался, в голове каша.
FaceController

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

    public function actionCreate()
    {
        $model = new ClientFace();
        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            return $this->redirect(['view', 'id' => $model->id]);
        } else {
            return $this->render('create', [
                'model' => $model,
            ]);
        }
    }
Аватара пользователя
smile
Сообщения: 40
Зарегистрирован: 2011.12.01, 11:36

Re: сохранить в связующую таблицу

Сообщение smile »

Во первых, вам не обязательно создавать модель на таблицу client_face_x_client_firm. Так же для этой таблицы не обязательно вводить id.
Что можно сделать в этом случае:

ClientFace

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

public function getFirms()
{
    return $this->hasMany(ClientFirm::className(), ['id' => 'client_firm_id'])->viaTable('client_face_x_client_firm', ['client_face_id' => 'id']);
}
И тогда в контроллере используйте функцию link

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


$face->link('firms', $firm);

Аватара пользователя
Vorx
Сообщения: 14
Зарегистрирован: 2010.05.08, 10:30
Откуда: Санкт-Петербург
Контактная информация:

Re: сохранить в связующую таблицу

Сообщение Vorx »

Т.к. firm Является обязательным параметром для создания контактного лица, то нужно его указать в параметрах action-а:

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

 public function actionCreate($firm)
Затем проверить - а есть ли фирма с переданным id в базе

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

$_firm = ClientFirm::findOne($firm);
if ($_firm==null) {
    throw new BadRequestHttpException('Фирма с указанным id не найдена');
}
// И дальше уже
$model = new ClientFace();
    if ($model->load(Yii::$app->request->post()) && $model->save()) {
        $model->link('firms', $_firm);
        return $this->redirect(['view', 'id' => $model->id]);
    } else {
        return $this->render('create', [
            'model' => $model,
        ]);
    }
dvs
Сообщения: 7
Зарегистрирован: 2016.02.11, 15:25

Re: сохранить в связующую таблицу

Сообщение dvs »

Спасибо за объяснения, теперь все стало ясно, особенно как пользоваться link()
Ответить