doufei4418
2016-03-09 17:54
浏览 116
已采纳

Laravel雄辩的foreach循环

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!

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • douhuocuo9012 2016-03-09 17:59
    已采纳

    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.

    已采纳该答案
    打赏 评论
  • duanchu0031 2016-03-09 18:33

    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();
    
    }
    
    打赏 评论

相关推荐 更多相似问题