Это потому, что вы присваиваете значения запроса вашей переменной клиента.
$customer=new Customer;
$customer=$request->name;
$customer=$request->type;
$customer=$request->dob;
$customer->save();
Когда вы звоните save()
, вы на самом деле звоните save()
в строке.Исправьте это, указав заполняемые свойства на вашей Customer
модели.Это только пример.
$customer = new Customer();
$customer->name = $request->name;
$customer->type = $request->type;
$customer->dob = $request->dob;
$customer->save();
После этого $customer->customer_id
не должен быть нулевым.
Редактировать: не удалось заметить следующую строку:
public $incrementing = false;
Это означает, что во время создания Customer
вам также нужно будет указать customer_id
, поскольку он больше не будет автоматически увеличиваться.
Я также более глубоко взглянул на API.Кажется, Laravel не будет знать об атрибуте, установленном триггером на этом этапе.Вы можете попробовать refresh()
модель, которая будет извлекать новые атрибуты из БД и при условии, что ваши триггеры работают нормально, вы должны получить обратно customer_id
.
Так что, по сути, просто добавьте эту строку переддобавление адреса доставки.
$customer->refresh();
Я также заметил, что у вас нет логики перенаправить пользователя обратно при успешном сохранении.Я подозреваю, что именно поэтому он выбрасывает 404, поскольку тот же маршрут не определен для запроса GET
.
public function store(Request $request)
{
$customer = new Customer;
$invoiceAddress = new Address;
$deliveryAddress = new Address;
$customer->name = $request->name;
$customer->type = $request->type;
$customer->dob = $request->dob;
$customer->country_code = $request->country_code;
$customer->save();
$customer->refresh();
$deliveryAddress->street_name_no = $request->street_name_no;
$deliveryAddress->city = $request->city;
$deliveryAddress->country = $request->country;
$deliveryAddress->customer_id = $customer->customer_id;
$deliveryAddress->save();
return back()->with('success', 'Success message here');
}
Повторно отредактировано:
Из документа видно, что метод refresh()
выглядит следующим образом:
/**
* Reload the current model instance with fresh attributes from the database.
*
* @return $this
*/
public function refresh()
{
if (! $this->exists) {
return $this;
}
$this->setRawAttributes(
static::newQueryWithoutScopes()->findOrFail($this->getKey())->attributes
);
$this->load(collect($this->relations)->except('pivot')->keys()->toArray());
$this->syncOriginal();
return $this;
}
Как видно из следующей строки:
static::newQueryWithoutScopes()->findOrFail($this->getKey())->attributes
Он попытается найти или потерпеть неудачу (404) при обновлении модели.В этом случае я подозреваю, что он не может получить соответствующий ключ и поэтому не работает.Я думаю, что в этом конкретном случае вам придется получить customer_id
из таблицы sequence_customers
.
Может быть, вы могли бы уйти, выполнив что-то вроде следующего:
// Assuming SequenceCustomer is the model name
$latest = \App\SequenceCustomer::latest()->first();
// and then you would be able to access the latest customer_id by doing the following
$customer_id = $latest->customer_id;
Это явно не масштабируемое решение, но я не совсем уверен, как еще решить эту конкретную проблему :)