У меня есть задание Laravel, которое устанавливает некоторые данные, а затем использует эти данные для создания записи в базе данных. Все поля в таблице базы данных NULL
возможность. Там есть custom_variables
поле — установить с помощью пользовательского метода getByPrefix()
,
MyJob.php
<?php
class MyJob implements ShouldQueue {
public function __construct($input) {
$this->input = $input;
}
public function handle() {
$data = $this->getData();
MyModel::create($data);
}
protected function getData() {
if (isset($this->input['name'])) {
$data['name'] = $this->input['name'];
}$data['custom_variables'] = $this->getByPrefix('custom-');
if (isset($this->input['surname'])) {
$data['surname'] = $this->input['surname'];
}
return $data;
}/**
* Filter the input by the provided prefix
* and return matching input data.
* @return null|string
*/
protected function getByPrefix($prefix) {
$this->input= array_filter($this->input, function($k) use ($prefix) {
return strpos($k, $prefix) !== false;
}, ARRAY_FILTER_USE_KEY);
if (count($this->input) === 0) {
return null;
}
$data = array();
foreach ($this->inputas $k => $v) {
array_push($data, array($k => $v));
}
if (empty($data)) {
return null;
}
return json_encode($data);
}
}
Эта проблема что если я продолжу звонить getByPrefix()
в середине, то значение $data['surname']
всегда NULL
когда запись сохраняется, даже если surname
присутствует на входе.
Когда я перехожу на getByPrefix()
в конце сценария, $data['surname']
настроен правильно.
Почему это происходит? Это потому что я может быть вернуть JSON из getByPrefix()
метод? Не думаю, но кто знает.
Я пытался обернуть тело getByPrefix()
в try-catch
— но нет никаких ошибок, и custom_variables
поле всегда устанавливается в БД.
Есть идеи, что здесь может происходить?
Обновить
Пример входных данных:
array(
'name' => 'John',
'surname' => 'Doe',
'custom-var' => 'customValue'
)
Выход (после getByPrefix()
применены):
array(
'name' => 'John',
'custom_variables' => "[{"custom-var":"customValue"}]")
Именно из-за этой части:
$this->input= array_filter($this->input, function($k) use ($prefix) {
return strpos($k, $prefix) !== false;
}, ARRAY_FILTER_USE_KEY);
Вы фильтруете свои данные и перезаписываете результаты. Попробуйте использовать другую переменную.
$input= array_filter($this->input, function($k) use ($prefix) {
return strpos($k, $prefix) !== false;
}, ARRAY_FILTER_USE_KEY);
Причина, по которой вы получаете name
но нет surname
просто потому, что вы устанавливаете имя перед вызовом метода, в то время как последнее устанавливается после.
Других решений пока нет …