2

I am having a foreach loop that goes through an array, and saves data with eloquent. And it works fine when it is like this:

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'] : ''
    ]);

}

But when I add if condition I get undefined variable question error.

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.';
    }
}

If any could help me with that, would very much appreciate that, thanks in advance!

alexander.polomodov
  • 5,396
  • 14
  • 39
  • 46
Ludwig
  • 1,401
  • 13
  • 62
  • 125
  • 1
    neither your question is clear nor your error. – Drudge Rajen Mar 09 '16 at 17:57
  • **!$question = Question::** ... should maybe be **$question != Question::** – ggdx Mar 09 '16 at 17:58
  • Well the code in the first example works, and I get to save data in database, but when I do foreach loop with if condition, I get undefined variable question error. And nothing gets saved in database. – Ludwig Mar 09 '16 at 18:01

2 Answers2

5

You are not injecting $question into your callback function. You need to use the use keyword:

if(!$question = Question::where('id', $question['id'])->where(function($query) use ($question) { $query-  >where('updated_at','<', $question['updated']); })->first()) {

Notice I added the use ($question) bit after function($query)

This allows $question to be accessed within the scope of the callback.

swatkins
  • 13,530
  • 4
  • 46
  • 78
0

have you tried using firstOrNew() ? Laravel documentation ->

"The firstOrNew method, like firstOrCreate will attempt to locate a record in the database matching the given attributes. However, if a model is not found, a new model instance will be returned. Note that the model returned by firstOrNew has not yet been persisted to the database. You will need to call save manually to persist it."

Example (using your $question value) :

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();

}
Cristian Michel
  • 306
  • 3
  • 8