Массовое задание Laravel из многомерного массива

Я создаю приложение Restful, поэтому я получаю запрос POST, который может выглядеть так

$_POST = array (
'person' => array (
'id' => '1',
'name' => 'John Smith',
'age' => '45',
'city' => array (
'id' => '45',
'name' => 'London',
'country' => 'England',
),
),

);

Я хотел бы сохранить мою личную модель и установить ее CITY_ID.

Я знаю, что самый простой способ — установить вручную $ person-> city_id = $ request [‘city’] [‘id]; но этот способ мне не помогает …. этот код является лишь примером, в моем реальном коде моя модель имеет 15 отношений

Есть ли способ сделать это в подобном $ Человек-> заполнить ($ запроса);?

Мои модели выглядят так:

город

class City extends Model {

public $timestamps = false;
public $guarded= ['id'];//Used in order to prevent filling from mass assignment

public function people(){
return $this->hasMany('App\Models\Person', 'city_id');
}

}

Человек

class Person extends Model {

public $timestamps = false;
public $guarded= ['id'];//Used in order to prevent filling from mass assignment

public function city(){
return $this->belongsTo('App\Models\City', 'city_id');
}
public static function savePerson($request){//Im sending a Request::all() from parameter
$person = isset($request['id']) ? self::find($request['id']) : new self();
$person->fill($request);//This won't work since my $request array is multi dimentional
$person->save();
return $person;
}

}

0

Решение

Это немного сложно, но вы можете переопределить fill метод в вашей модели, и установить deeplyNestedAttributes() для хранения атрибутов, которые будут искать в запросе

class Person extends Model {

public $timestamps = false;
public $guarded= ['id'];//Used in order to prevent filling from mass assignment

public function city(){
return $this->belongsTo('App\Models\City', 'city_id');
}

public static function savePerson($request){//Im sending a Request::all() from parameter
$person = isset($request['id']) ? self::find($request['id']) : new self();
$person->fill($request);//This won't work since my $request array is multi dimentional
$person->save();
return $person;
}

public function deeplyNestedAttributes()
{
return [
'city_id',
// another attributes
];
}

public function fill(array $attributes = [])
{
$attrs = $attributes;
$nestedAttrs = $this->deeplyNestedAttributes();

foreach ($nestedAttrs as $attr) {
list($relationName, $relationAttr) = explode('_', $attr);

if ( array_key_exists($relationName, $attributes) ) {

if ( array_key_exists($relationAttr, $attributes[$relationName]) ) {

$attrs[$attr] = $attributes[$relationName][$relationAttr];
}
}
}
return parent::fill($attrs);
}

}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]