У меня есть цикл foreach, который проходит через массив и сохраняет данные с помощью eloquent. И это прекрасно работает, когда это так:
foreach($questions['questions'] as $question) {
$questionObject = Question::create([
'external_id' => $question['id'],
'text' => $question['question_text'],
'type' => $question['question_type'],
'image' => (array_key_exists('question_image', $question)) ?
$question['question_image'] : ''
]);
}
Но когда я добавляю условие if, я получаю неопределенную переменную с вопросом об ошибке.
foreach($questions['questions'] as $question) {
if(!$question = Question::where('id', $question['id'])->where(
function($query){
$query->where('updated_at','<', $question['updated']);
}})->first()) {
$questionObject = Question::create([
'external_id' => $question['id'],
'text' => $question['question_text'],
'type' => $question['question_type'],
'image' => (array_key_exists('question_image', $question)) ?
$question['question_image'] : ''
]);
} else {
return 'Question: '.$question['external_id'].' already exist.';
}
}
Если бы кто-нибудь мог помочь мне с этим, был бы очень признателен, спасибо заранее!
Вы не вводите $question
в вашу функцию обратного вызова. Вам нужно использовать use
ключевое слово:
if(!$question = Question::where('id', $question['id'])->where(function($query) use ($question) { $query- >where('updated_at','<', $question['updated']); })->first()) {
Обратите внимание, я добавил use ($question)
немного позже function($query)
Это позволяет $question
быть доступным в рамках обратного вызова.
Вы пытались использовать firstOrNew ()?
Документация Laravel ->
«Метод firstOrNew, например firstOrCreate, попытается найти в базе данных запись, соответствующую заданным атрибутам. Однако, если модель не найдена, будет возвращен новый экземпляр модели. Обратите внимание, что модель, возвращенная firstOrNew, еще не сохранена. в базу данных. Вам нужно будет вызвать сохранить вручную, чтобы сохранить его. «
Пример (используя ваше значение $ question):
foreach($questions['questions'] as $question) {
$questionObject = Question::firstOrNew(
array(
'external_id' => $question['id'],
'text' => $question['question_text'],
'type' => $question['question_type'],
'image' =>$question['question_image']
)
);
$questionObject->external_id = $question['id'];
$questionObject->text = $question['text'];
.
.
.
$questionObject->save();
}