Laravel 5.2 Eloquent - сохранение данных в нескольких таблицах для сохранения _id - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть три таблицы: страницы, верхние и нижние колонтитулы. У меня есть отношения, настроенные так, чтобы Page 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, заголовок: «Заголовок страницы», some_text: «бла-бла-бла»}
нижние колонтитулы: {id: 2, page_id: 12, текст: "More blah blah blah"}
заголовки: {id: 4, page_id: 12, текст: «Здесь нечего видеть»}

Как мне получить, чтобы footer_id и header_id также сохранили правильные идентификаторы?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Есть 2 способа сделать это. Во-первых, ваш код уже правильный, вам просто нужно сохранить верхний и нижний колонтитулы.

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;
}
0 голосов
/ 18 сентября 2018

В идеале вы бы не стали. Из вашего кода я понимаю, что 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...