Laravel 5.2 Eloquent - Сохранение данных в нескольких таблицах для сохранения _id

У меня есть три таблицы: страницы, верхние и нижние колонтитулы. У меня отношения установлены так, что страницы 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 были сохранены правильные идентификаторы?

Спасибо.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
0
89
2

Ответы 2

В идеале вы бы этого не сделали. Из вашего кода я понимаю, что 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;
}

Если я удалю header_id и footer_id из таблицы страниц, ни один из них не загрузится. :(

DondeEstaMiCulo 18.09.2018 06:01

Вам просто нужно их спасти. -> save () заголовок и нижний колонтитул. Конечно, вам нужно сначала сохранить страницу, затем связать () верхний и нижний колонтитулы со страницей, а затем сохранить их.

zjbarg 18.09.2018 16:54

Возможно, мне не хватает этого шага «associate()», но когда я пробую его, я получаю ошибку «Вызов неопределенного метода». Я снова удалил header_id и footer_id из таблицы страниц, и теперь текст не отображается (но это происходит, когда у меня есть «правильные» поля и идентификаторы). Может быть, вы могли бы показать (в коде), что мне здесь не хватает?

DondeEstaMiCulo 19.09.2018 08:14

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

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 19.09.2018 06:46

@DondeEstaMiCulo, отметьте мой ответ как лучший ответ, если вы сочли его полезным :)

aceraven777 12.08.2019 16:40

Другие вопросы по теме