Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 21.08.2018 00:44:10

Column 'day_reports_id' cannot be null - хотя это внешний ключ

Получаю ошибку:

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'day_reports_id' cannot be null (SQL: insert into `elementary_reports` (`type`, `project`, `subproject`, `report`, `time`, `day_reports_id`, `updated_at`, `created_at`) values (Рабочее время, Рабочее время, Рабочее время, Рабочее время, 5, , 2018-08-20 21:04:51, 2018-08-20 21:04:51))

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

Миграции:

 Schema::create('day_reports', function (Blueprint $table) {
            $table->increments('id');
            $table->text('username');
            $table->timestamps();
        });
Schema::create('elementary_reports', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('day_reports_id')->unsigned();
            $table->foreign('day_reports_id')->references('id')->on('day_reports');
            $table->text('type');
            $table->text('project');
            $table->text('subproject')->nullable();
            $table->text('report');
            $table->double('time');
            $table->timestamps();
        });

Контроллер:

  $dayReport = new DayReport();
        $dayReport -> username = Auth::user()->name;
 
        $dayReport->elementaryReports()->saveMany([
            new ElementaryReport(['type' => 'Рабочее время', 'project' => 'Рабочее время', 'subproject' => 'Рабочее время', 'report' => 'Рабочее время', 'time' => 5]),
            new ElementaryReport(['type' => 'Рабочее врем2', 'project' => 'Рабочее врем2', 'subproject' => 'Рабочее врем2', 'report' => 'Рабочее врем2', 'time' => 6]),
        ]);

Модель:

 class DayReport extends Model
{
    public function elementaryReports()
    {
        return $this->hasMany('App\ElementaryReport', 'day_reports_id', 'id');
    }

Что здесь не так?

Не в сети

#2 21.08.2018 06:23:38

Re: Column 'day_reports_id' cannot be null - хотя это внешний ключ

А значение и не должно само подставляться. Ты должен сам указать, что вставлять

Не в сети

#3 21.08.2018 08:47:47

Re: Column 'day_reports_id' cannot be null - хотя это внешний ключ

А значение и не должно само подставляться. Ты должен сам указать, что вставлять

Как сам, это же ключ, который связан с автоинкрементным полем. Там автоматом проставляется айдишник, который должен также проставляться и в 'day_reports_id'. Т.е. у меня добавляется одна запись в таблицу 'day_reports' и несколько записей в таблицу 'elementary_reports', которые привязаны внешним ключем 'day_reports_id' к полю 'id' таблицы 'day_reports'. Т.е. значение должно браться оттуда. А инаже откуда мне знать какой айдишник туда проставить? Если я этот айдишник буду проставлять самостоятельно, то теряется весь смысл использования Отношений в ларавеле. Поправьте если ошибаюсь (а где-то я все же ошибаюсь).

Не в сети

#4 21.08.2018 15:43:07

Re: Column 'day_reports_id' cannot be null - хотя это внешний ключ

А как Ларавелю узнать, к какой записи в таблице day_reports ты хочешь привязать запись из таблицы elementary_reports ?

Не в сети

#5 21.08.2018 20:15:07

Re: Column 'day_reports_id' cannot be null - хотя это внешний ключ

А как Ларавелю узнать, к какой записи в таблице day_reports ты хочешь привязать запись из таблицы elementary_reports ?

Так я это указал Ларавелю в методе модели:

public function elementaryReports()
    {
        return $this->hasMany('App\ElementaryReport', 'day_reports_id', 'id');
    }

И для самой БД указал в миграциях:

$table->foreign('day_reports_id')->references('id')->on('day_reports');

Может каким-то образом это еще нужно указать здесь для каждого нового обьекта ElementaryReport:

$dayReport->elementaryReports()->saveMany([
            new ElementaryReport(['type' => 'Рабочее время', 'project' => 'Рабочее время', 'subproject' => 'Рабочее время', 'report' => 'Рабочее время', 'time' => 5]),
            new ElementaryReport(['type' => 'Рабочее врем2', 'project' => 'Рабочее врем2', 'subproject' => 'Рабочее врем2', 'report' => 'Рабочее врем2', 'time' => 6]),
        ]);

Но не указывать же какое конкретно значение айдишника писать? Оно должно автоматически инкрементироваться. Что-то я либо упустил, либо недопонял. Подскажите как исправить косяк.

Не в сети

#6 21.08.2018 20:17:04

Re: Column 'day_reports_id' cannot be null - хотя это внешний ключ

Но не указывать же какое конкретно значение айдишника писать?

Именно, что указывать

Оно должно автоматически инкрементироваться.

С чего ты взял?

Не в сети

#7 21.08.2018 20:33:29

Re: Column 'day_reports_id' cannot be null - хотя это внешний ключ

С чего ты взял?

По двум причинам:
Во-первых это нелогично т.к. я уже писал об этом выше:

А иначе откуда мне знать какой айдишник туда проставить? Если я этот айдишник буду проставлять самостоятельно, то теряется весь смысл использования Отношений в ларавеле.

Во-вторых потому, что об это так написано в документации на этом сайте:
https://laravel.ru/docs/v5/eloquent-relationships
Можно найти поиском по: "Метод save() автоматически добавит надлежащее значение post_id в новую модель"
@Morry, если знаешь как устранить ошибку - подскажи. А не знаешь - нечего мозги парить встречными вопросами, т.к. они не наталкивают на подсказку, т.к. бессмысленны.

Изменено Antuan (21.08.2018 20:35:03)

Не в сети

#8 21.08.2018 22:27:00

TrueKanonir
Откуда: Ташкент
Сообщений: 221

Re: Column 'day_reports_id' cannot be null - хотя это внешний ключ

Ты создал объект

PHP
$dayReport = new DayReport();

Это просто пустая модель которая знает к какой таблице в бд она относится, но определенной записи этой таблице в моделе нет.
Сделай так

PHP
 $dayReport = (new DayReport())->find(1); // передай сюда ид записи к которой надо привязать рабочее время
        
$dayReport -> username Auth::user()->name;

        
$dayReport->elementaryReports()->saveMany([
            new 
ElementaryReport(['type' => 'Рабочее время''project' => 'Рабочее время''subproject' => 'Рабочее время''report' => 'Рабочее время''time' => 5]),
            new 
ElementaryReport(['type' => 'Рабочее врем2''project' => 'Рабочее врем2''subproject' => 'Рабочее врем2''report' => 'Рабочее врем2''time' => 6]),
        ]);

Не в сети

#9 21.08.2018 22:30:13

Re: Column 'day_reports_id' cannot be null - хотя это внешний ключ

Да, это то, что нужно. Спасибо большое!

Не в сети

Подвал раздела