2016-05-09 7 views
0

У меня есть форма, которая захватывает пользователь деталь и хотят сохранить на две отдельные модели: контактов и contract_addresses.Создания записей в нескольких моделях из одной формы с красноречивым

Ниже выход из моей $request->all() внутри метода контроллера:

{ 
    "first_name": "Joe", 
    "last_name": "Jackson", 
    "nickname": "JJ", 
    "salutation": "Mr", 
    "contact_address": { 
    "phone_mobile": "123456789", 
    "email": "[email protected]", 
    "address_1": "123 Office", 
    "postcode": "2334", 
    "address_2": "456 Lane", 
    "province": "New Portia", 
    "city": "Okalaville", 
    "country": "Golubia" 
    } 
} 

Я создал соответствующие отношения в моей модели следующим образом:

Контакты Модель:

public function address() 
{ 
    return $this->hasOne('App\Contact_address'); 
} 

Контакт_Address Модель:

public function contact() 
{ 
    return $this->belongsTo('App\Contact'); 
} 

Контроллер Метод: Вот как я есть установка методы контроллера:

public function store(Request $request) 
{ 
    $contact = new Contact($request->except("contact_address")); 
    $contact_address = new Contact_address($request->contact_address); 
    $contact->setRelation('address', $contact_address); 
    $contact->push(); 
    return back(); 
} 

Ошибки с толчком():push() выше бросками 2 исключения SQL:

1/2 PDOException в строке Connection.php 408:

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`myappdb`.`contact_addresses`, CONSTRAINT `contact_addresses_contact_id_foreign` FOREIGN KEY (`contact_id`) REFERENCES `contacts` (`id`)) 

2/2 QueryException в connection.php линии 673:

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`myappdb`.`contact_addresses`, CONSTRAINT `contact_addresses_contact_id_foreign` FOREIGN KEY (`contact_id`) REFERENCES `contacts` (`id`)) (SQL: insert into `contact_address` (`phone_mobile`, `email`, `address_1`, `postcode`, `address_2`, `province`, `city`, `country`, `updated_at`, `created_at`) values (343434, , , , , , , , 2016-05-08 23:53:02, 2016-05-08 23:53:02)) 

Я подозреваю, что проблема, кажется, что внешний ключ для contact.id не передается через при выполнении SQL вставки для адресов, даже если сам контакт действительно вставлен в таблицу контактов успешно.

Как создать новую запись в обеих таблицах?

  • Должен ли я создать контакт, получить контакт.id, а затем использовать это снова, чтобы сохранить адреса?
  • Лучше ли удалить ограничение внешнего ключа sql в моем db?
  • Как вы бы структурировали это?
+0

Почему вы не храните все свои данные в модели «Контакт», установив «contact_address» в качестве столбца JSON? Таким образом, вам не нужны дополнительные модели. – enriqg9

+0

Я не думаю, что это фактически спасло Контакт. Попробуйте изменить свой код на $ contact = Contact :: create ($ request-> except ("contact_address")); – Brett

ответ

1

Использование save способ.

public function store(Request $request) { 
$contact = Contact::create($request->except(["contact_address"])); 
$contact_address = new Contact_address($request->get('contact_address')); 
$contact->contact_address()->save($contact_address); 
return back(); 
} 
+0

Спасибо Abhishek - Это действительно сработало, но с небольшим изменением. Метод save() принимает красноречивую модель, и мы передаем ей массив.Итак, приспосабливая выше: '$ contact_address = new Contact_address ($ request-> contact_address); $ contact = Contact :: create ($ request-> except ("contact_address")); $ contact-> addresses() -> save ($ contact_address); ' – Noddy

+1

Упс! моя вина. Обновлено. – Abhishek

+0

Perfect. Спасибо, что нашли время ответить и обновить – Noddy

Смежные вопросы