В методе store() модели я хочу сохранить еще две модели. Мне нужен идентификатор текущей модели, которую я храню. Как я могу это получить?
Контроллер
public function store(Request $request, Property $property)
{
/*******************************************************
* Validation sent data
* Validate e forme ersali user
*******************************************************/
$data = $request->validate([
'type' => 'required',
'title' => 'required',
'description' => 'required',
'base_capacity' => 'required',
'max_occupancy' => 'required',
]);
Property::create($data);
PropertyDetail::create([
'property_id' => 1,
'state' => $request->state,
'city' => $request->city,
'address' => $request->address,
'post_code' => $request->post_code,
'placearea' => $request->place_area,
'telephone' => $request->telephone,
]);
}
Здесь я жестко закодировал идентификатор свойства в деталях свойства. Однако я хочу получить идентификатор текущего свойства, которое я только что создал выше.
Property
$property = Property::create($data);
PropertyDetail::create([
'property_id' => $property->id, // here it is
'state' =>$request->state,
'city' =>$request->city,
'address' =>$request->address,
'post_code' =>$request->post_code,
'placearea' =>$request->place_area,
'telephone' =>$request->telephone,
]);
Более безопасный подход почти идентичен, за исключением того, что вы используете два запроса, и запросы могут завершиться ошибкой. Вы хотите убедиться, что либо оба преуспеют, либо никто не преуспеет. Для этого мы используем транзакции.
Что мы делаем безопасно, так это то, что данные попадут в базу данных.
public function store(Request $request,Property $property)
{
/*******************************************************
* Validation sent data
* Validate e forme ersali user
*******************************************************/
$data = $request->validate([
'type' => 'required',
'title' => 'required',
'description' => 'required',
'base_capacity' => 'required',
'max_occupancy' => 'required',
]);
\DB::transaction(function() use ($data, $request) {
$property = Property::create($data);
PropertyDetail::create([
'property_id' => $property->id,
'state' =>$request->state,
'city' =>$request->city,
'address' =>$request->address,
'post_code' =>$request->post_code,
'placearea' =>$request->place_area,
'telephone' =>$request->telephone,
]);
});
}
хорошо, но когда я использую транзакцию, $requests становятся переменной undefined. спасибо за хороший ответ кстати
Это связано с областью действия функции, передайте $request внутренней функции \DB::transaction(function() use ($data, $request) {
Вы можете получить id
из Property
, используя модель, возвращаемую методом create
, и использовать там, где вам нужно.
$property = Property::create($data);
PropertyDetail::create([
'property_id' => $property->id,
'state' =>$request->state,
'city' =>$request->city,
'address' =>$request->address,
'post_code' =>$request->post_code,
'placearea' =>$request->place_area,
'telephone' =>$request->telephone,
]);
Рекомендуется использовать транзакции :)