Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Получаю ошибку:
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');
}
Что здесь не так?
Не в сети
А значение и не должно само подставляться. Ты должен сам указать, что вставлять
Не в сети
А значение и не должно само подставляться. Ты должен сам указать, что вставлять
Как сам, это же ключ, который связан с автоинкрементным полем. Там автоматом проставляется айдишник, который должен также проставляться и в 'day_reports_id'. Т.е. у меня добавляется одна запись в таблицу 'day_reports' и несколько записей в таблицу 'elementary_reports', которые привязаны внешним ключем 'day_reports_id' к полю 'id' таблицы 'day_reports'. Т.е. значение должно браться оттуда. А инаже откуда мне знать какой айдишник туда проставить? Если я этот айдишник буду проставлять самостоятельно, то теряется весь смысл использования Отношений в ларавеле. Поправьте если ошибаюсь (а где-то я все же ошибаюсь).
Не в сети
А как Ларавелю узнать, к какой записи в таблице day_reports ты хочешь привязать запись из таблицы elementary_reports ?
Не в сети
А как Ларавелю узнать, к какой записи в таблице 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]),
]);
Но не указывать же какое конкретно значение айдишника писать? Оно должно автоматически инкрементироваться. Что-то я либо упустил, либо недопонял. Подскажите как исправить косяк.
Не в сети
Но не указывать же какое конкретно значение айдишника писать?
Именно, что указывать
Оно должно автоматически инкрементироваться.
С чего ты взял?
Не в сети
С чего ты взял?
По двум причинам:
Во-первых это нелогично т.к. я уже писал об этом выше:
А иначе откуда мне знать какой айдишник туда проставить? Если я этот айдишник буду проставлять самостоятельно, то теряется весь смысл использования Отношений в ларавеле.
Во-вторых потому, что об это так написано в документации на этом сайте:
https://laravel.ru/docs/v5/eloquent-relationships
Можно найти поиском по: "Метод save() автоматически добавит надлежащее значение post_id в новую модель"
@Morry, если знаешь как устранить ошибку - подскажи. А не знаешь - нечего мозги парить встречными вопросами, т.к. они не наталкивают на подсказку, т.к. бессмысленны.
Изменено Antuan (21.08.2018 20:35:03)
Не в сети
$dayReport = new DayReport();
Это просто пустая модель которая знает к какой таблице в бд она относится, но определенной записи этой таблице в моделе нет.
Сделай так
$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]),
]);
Не в сети
Да, это то, что нужно. Спасибо большое!
Не в сети