У Laravel есть много ошибок. 'site_id' не имеет значения по умолчанию - PullRequest
0 голосов
/ 30 августа 2018

У меня есть следующий метод в контроллере

public function store(Request $request)
{
    $site = Site::create([
        "path" => $request->path,
        "site_link" => $request->link,
    ]);

    if ($request->features) {
        $features = explode(',', $request->features);

        foreach ($features as $feature) {
            $site->features()->save(SiteFeature::create(["feature" => $feature]));
        }
    }

    return response()->json($site, 201);
}

Модель сайта имеет этот метод

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

И это мое $fillable свойство SiteFeature

protected $fillable = ['feature', 'site_id'];

По какой-то причине я получаю следующую ошибку

local.ERROR: SQLSTATE [HY000]: Общая ошибка: 1364 Поле 'site_id' не имеет значения по умолчанию (SQL: вставить в site_features (feature) значения (фес)) {"исключение": "[объект] (Подсветка \ База данных \ QueryException (код: HY000): SQLSTATE [HY000]: Общая ошибка: 1364 Поле 'site_id' не имеет значения по умолчанию (SQL: вставить в site_features (feature) значения (фес))

Ответы [ 3 ]

0 голосов
/ 30 августа 2018

попробуйте

в вашей модели features

public function features()
{
  return $this->hasMany('App\SiteFeature','site_id','id');
}

Ваша модель SiteFeature

public function siteFeatures()
{
  return $this->belongsTo('App\features', 'site_id', 'id');
}
0 голосов
/ 30 августа 2018
$site = Site::create([
    "path" => $request->path,
    "site_link" => $request->link,
]);

Не возвращает идентификатор последней вставки ... попробуйте

$site = new Site;
$site->path = $request->path;
$site->site_link = $request->link;
$site->save();

Что касается этой части:

if ($request->features) {
    $features = explode(',', $request->features);

    foreach ($features as $feature) {
        $site->features()->save(SiteFeature::create(["feature" => $feature]));
    }
}

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

if ($request->features) {
    $features = explode(',', $request->features);

    foreach ($features as $feature) {
        $sf = new SiteFeature;
        $sf->feature = $feature;
        $sf->site_id = $site->id;
        $sf->save();
    }
}
0 голосов
/ 30 августа 2018

Метод Model::create фактически создает запись в вашей базе данных, и, поскольку вы не указываете обязательное значение site_id, происходит сбой, поэтому вы видите эту ошибку.

Похоже, что вы пытаетесь использовать отношения Laravel для сохранения нового SiteFeature для сайта, но вы передаете то, что уже было бы существующим объектом (если запрос не сработал) в * 1006 отношения * метод.

Вам необходимо либо передать новый экземпляр SiteFeature, который еще не был сохранен в базе данных, в метод save:

$this->features()->save(new SiteFeature(['feature' => $feature]));

или вы можете использовать метод отношения create, чтобы избежать необходимости передавать экземпляр целиком, вам просто нужно предоставить атрибуты:

$this->features()->create(['feature' => $feature]);
...