具有条件的Laravel ORM

时间:2015-10-02 06:55:13

标签: mysql laravel laravel-4 laravel-5 query-builder

我有一张类似的表 -

enter image description here

模特喜欢它 -

    <?php

    namespace App;

    use Illuminate\Database\Eloquent\Model;
    use Illuminate\Http\Request;

    class webinar_vote extends Model
    {
        protected $fillable = array('webinar_id');
        protected $table = 'webinar_vote';
        protected $primaryKey='webinar_id';
        public $timestamps=false;
    }

我想要的是,

  1. 如果 $ input ['yes_no_value'] 为'是',则仅增加 vote_yes
  2. 如果 $ input ['yes_no_value'] 为“否”,则仅增加 vote_no
  3. 像这样的模型查询 -

        if('yes'==$input['yes_no_value'])
        {
            webinar_vote::firstOrCreate([
                                        'webinar_id' => $input['uuid']
                                    ])->increment('vote_yes');
        }
        else
        {
            webinar_vote::firstOrCreate([
                                        'webinar_id' => $input['uuid']
                                    ])->increment('vote_no');
        }
    

    但主要问题是我无法获得第一个投票值。

    创建条目时,数据不会增加。

    创建后,它可以正常工作。

    我做错了什么?

    有人可以帮我吗?

1 个答案:

答案 0 :(得分:1)

我不确定我是否正确地想到这一点,但我感觉在使用firstOrCreate时,如果找不到匹配项并创建新记录,则会忽略任何链式方法。

如果使用firstOrNew,则会在找到匹配项时返回模型实例,或者在找不到匹配项时返回模型的新实例。

$webinarVote = webinar_vote::firstOrNew(['webinar_id' => $input['uuid']]); 

if('yes'== $input['yes_no_value'])
{
    $webinarVote->vote_yes = $webinarVote->vote_yes + 1;
}
else
{        
    $webinarVote->vote_no = $webinarVote->vote_no + 1;
}

$webinarVote->save();

与您的问题无关,但值得注意的是,您的班级名称不符合现代php标准。您应该尝试使用符合PSR-1标准的Laravels内嵌您的命名约定。具体做法是:

  

类名必须在StudlyCaps中声明。