Laravel 5.8 - Невозможно добавить или обновить дочернюю строку, используя Laravel - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть простая таблица с несколькими данными, которая выглядит следующим образом:

Таблица страниц

Enter image description here

Я создал связьк таблице с именем prebids, например, так:

public function up()
{
    Schema::create('prebids', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('bidder_name');
        $table->string('params_name');
        $table->string('params_value');
        $table->bigInteger('page_id')->unsigned();
        $table->foreign('page_id')->references('id')->on('pages')->onDelete('cascade');
        $table->timestamps();
    });
}

Вот модель страницы:

class Page extends Model
{
    protected $fillable = [
        "title",
        "articles",
        "status"
    ];

    public function prebids() {
        return $this->hasMany('App\Prebid');
    }
}

Вот модель с префиксами:

class Prebid extends Model
{
    protected $fillable = [
        "params_name",
        "params_value",
        "bidder_name"
    ];
    public function page()
    {
        return $this->belongsTo('App\Page');
    }
}

Сейчаскогда пользователь нажимает кнопку «Добавить предоплаты», я хочу сохранить данные предоплаты в соответствии с моделью.

Итак, при pages index.blade.php при добавлении кнопки у меня появляется

<td>
    <a href="{{ route('prebids.create'), $page->id}}"
       class="btn btn-sm btn-primary">Add prebid</a>

И на prebid controller У меня есть следующее:

class PrebidController extends Controller
{

    public function create()
    {
        $prebid = Prebid::all();
        $page = Page::all();

        return view('prebids.create', ['page' => $page]);
    }

    public function store(Request $request)
    {
        foreach ($request->input() as $parameters) {
            $parameters = new prebid();
            $parameters->save();
        }
        return redirect("/pages")->with("sucess", "data successfully saved");
    }

}

Теперь, когда пользователь нажимает кнопку «Добавить пребид», он открывает форму, в которой пользователь может добавлять информацию и отправлять, когда я отправляю, я получаю следующее сообщение об ошибке

SQLSTATE [23000]: нарушение ограничения целостности: 1452 Невозможно добавить или обновить дочернюю строку: ошибка ограничения внешнего ключа (royalad. prebids, CONSTRAINT prebids_page_id_foreign FOREIGN KEY (page_id)ССЫЛКИ pages (id) НА УДАЛИТЬ КАСКАД) (SQL: вставить в prebids (updated_at, created_at) значения (2019-11-06 15:24:34, 2019-11-06 15: 24: 34))

Что не так с моим кодом?

1 Ответ

0 голосов
/ 06 ноября 2019

Вам необходимо связать страницу с моделью перед ее сохранением:

$parameters = new prebid();
$parameters->page()->associate( $theActualPageObject )
$parameters->save();

В противном случае столбец page_id в вашей таблице prebid будет пустым, что недопустимо, поскольку вы настроилисвязь с pages.id там - отсюда и ошибка ограничения внешнего ключа.

Если у вас не всегда есть страница, вы также можете сделать page_id nullable и установить по умолчанию null

$table->bigInteger('page_id')->unsigned()->nullable()->default(null);
...