Я пытаюсь создать объекты, используя функцию Mass-assign Eloquent...
$new = new Contact(Input::all());
$new->save();
Проблема в том, что в этом случае каждое поле заполняется пустой строкой вместо значений null
, как я ожидал.
В настоящее время я разрабатываю систему, и некоторые столбцы таблицы не определены, поэтому, используя этот метод, чтобы не добавлять каждое новое поле в массив $fillable
и new Contact(array(...));
...
Также у меня около 20 полей в этой таблице, поэтому было бы немного уродливо иметь такой массив, как
$new = new Contact(array(
'salutation' => Input::get('salutation'),
'first_name' => Input::get('first_name'),
'last_name' => Input::get('last_name'),
'company_id' => Input::get('company_id'),
'city' => ...
...
));
Какие-нибудь советы о том, как это сделать или исправить?
Обновление. Теперь я решил это сделать array_filter в App::before()
.
Обновление В фильтре было немного беспорядка. Я в конечном итоге делаю:
public static function allEmptyIdsToNull()
{
$input = Input::all();
$result = preg_grep_keys ( '/_id$/' , $input );
$nulledResults = array_map(function($item) {
if (empty($item))
return null;
return $item;
}, $result);
return array_merge($input, $nulledResults);
}
И в моих functions.php.
if ( ! function_exists('preg_grep_keys'))
{
/**
* This function gets does the same as preg_grep but applies the regex
* to the array keys instead to the array values as this last does.
* Returns an array containing only the keys that match the exp.
*
* @author Daniel Klein
*
* @param string $pattern
* @param array $input
* @param integer $flags
* @return array
*/
function preg_grep_keys($pattern, array $input, $flags = 0) {
return array_intersect_key($input, array_flip(preg_grep($pattern, array_keys($input), $flags)));
}
}
В настоящее время работает только с полями, которые заканчиваются на "_id". Это моя самая большая проблема, как если бы связь не была null
, база данных будет вызывать ошибку, поскольку внешний ключ "" не может быть найден.
Работает отлично. Любой комментарий?