Laravel красноречивый цикл foreach

У меня есть цикл 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.';
}
}

Если бы кто-нибудь мог помочь мне с этим, был бы очень признателен, спасибо заранее!

1

Решение

Вы не вводите $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 быть доступным в рамках обратного вызова.

5

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

Вы пытались использовать 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();

}
0

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