У меня есть три таблицы: страницы, верхние и нижние колонтитулы. У меня отношения установлены так, что страницы hasOne('App\Footer') и hasOne('App\Header'). Верхний и нижний колонтитулы - каждый belongTo('App\Page'). В таблице страниц есть header_id и footer_id. У остальных есть page_id. Когда я извлекаю Page, верхний и нижний колонтитулы также вытягиваются ЕСЛИ (и только если) все идентификаторы соответствуют друг другу.
В моем контроллере нет проблем с сохранением Page, включая верхний и нижний колонтитулы. Но поскольку у меня установлены отношения, все идентификаторы должны быть правильно сохранены, но только page_id сохраняется в таблице нижних колонтитулов и заголовков - идентификаторы нижних колонтитулов и заголовков не сохраняются в таблице страниц. Вот что у меня есть на данный момент:
public function putAddpage(Request $request)
{
$header = new Header(['text' => $request->input('header-text')]);
$footer = new Footer(['text' => $request->input('footer-text')]);
$page = new Page();
$page->title = $request->input('page-title');
$page->some_text = $request->input('some_text');
$page->save();
$page->header()->save($header);
$page->footer()->save($footer);
return $page;
}
Пример данных БД:
страницы: {id: 12, footer_id: 0, header_id: 0, title: "Заголовок страницы", some_text: "бла-бла-бла"}
нижние колонтитулы: {id: 2, page_id: 12, text: "Еще бла-бла-бла"}
заголовки: {id: 4, page_id: 12, text: "Здесь нечего смотреть"}
Как мне сделать так, чтобы для footer_id и header_id были сохранены правильные идентификаторы?
Спасибо.






В идеале вы бы этого не сделали. Из вашего кода я понимаю, что header_id и footer_id там быть не должны, они вам не нужны.
если вы хотите получить заголовок страницы ..
$page->header;
вам не нужен header_id в таблице страниц, чтобы это работало! поскольку вы уже определили отношения (страница -> заголовок hasOne)
Вы пытаетесь добиться другого поведения?
public function putAddpage(Request $request)
{
// need to save or use Create method.
// Using save()
$header = new Header(['text' => $request->input('header-text')])->save();
// Using create ( will save automatically )
$footer = Footer::Create(['text' => $request->input('footer-text')]);
$page = new Page();
$page->title = $request->input('page-title');
$page->some_text = $request->input('some_text');
// now save the page
$page->save();
// now the page has an id.
// Associate header and footer ( this will set the page_id on the header and the footer )
$page->header()->associate($header);
$page->footer()->associate($footer);
$page->save(); // not sure if you need to save now. Try removing this and see :).
return $page;
}
Вам просто нужно их спасти. -> save () заголовок и нижний колонтитул. Конечно, вам нужно сначала сохранить страницу, затем связать () верхний и нижний колонтитулы со страницей, а затем сохранить их.
Возможно, мне не хватает этого шага «associate()», но когда я пробую его, я получаю ошибку «Вызов неопределенного метода». Я снова удалил header_id и footer_id из таблицы страниц, и теперь текст не отображается (но это происходит, когда у меня есть «правильные» поля и идентификаторы). Может быть, вы могли бы показать (в коде), что мне здесь не хватает?
Это можно сделать двумя способами. Во-первых, ваш код уже правильный, вам просто нужно сохранить верхний и нижний колонтитулы.
public function putAddpage(Request $request)
{
$header = new Header(['text' => $request->input('header-text')])->save();
$footer = new Footer(['text' => $request->input('footer-text')])->save();
$page = new Page();
$page->title = $request->input('page-title');
$page->some_text = $request->input('some_text');
$page->header_id = $header->id;
$page->footer_id = $footer->id;
$page->save();
return $page;
}
Во-вторых, назначьте странице header_id и footer_id.
public function putAddpage(Request $request)
{
$header = new Header(['text' => $request->input('header-text')])->save();
$footer = new Footer(['text' => $request->input('footer-text')])->save();
$page = new Page();
$page->title = $request->input('page-title');
$page->some_text = $request->input('some_text');
$page->save();
$page->header()->save($header);
$page->footer()->save($footer);
return $page;
}
Это полностью работает, и теперь я успешно использую его, спасибо. Хотя мне пришлось перенести методы save() на переменные после их создания. Если бы я делал это без Eloquent, я бы не помещал page_id в таблицы верхних и нижних колонтитулов, чтобы это работало должным образом. Я чувствую, что, хотя это работает так, как я хотел, у меня все еще могут быть проблемы с БД / отношениями.
@DondeEstaMiCulo, отметьте мой ответ как лучший ответ, если вы сочли его полезным :)
Если я удалю
header_idиfooter_idиз таблицы страниц, ни один из них не загрузится. :(