将行设置为1,而将其他行设置为0,以Eloquent表示

时间:2015-03-03 22:54:55

标签: php mysql laravel laravel-4 eloquent

持卡人可以在mysql表中只有一张主信用卡。 1如果用于主要和其他未使用的值是0。

我需要的是:

UPDATE credit_cards SET primary=IF(id=cardholder_id, 1, 0)

到目前为止我所拥有的是:

$cardholder_id = Input::get('cardholder_id');
$card_id = Input::get('card_id'); // For updating that specific card
$result = DB::table('creditcards')
    ->where('cardholder_id', '=', $cardholder_id)
    ->update(['primary' => 0]);
// Now I have to do another query for updating chosen $card_id 'primary' attribute to 1

如果可能的话,我需要在一个查询中用eloquent或query builder表示。非常感谢你。

1 个答案:

答案 0 :(得分:1)

对于您的代码,您需要做的就是更改更新语句:

$result = DB::table('creditcards')
    ->where('cardholder_id', '=', $cardholder_id)
    ->update(['primary' => DB::raw('IF(id='.$card_id.', 1, 0)')]);

对于更多Laravel-ish解决方案,如果您正确设置了模型和关系,则可以将此逻辑提取到Cardholder模型的方法中:

class Cardholder extends Eloquent {
    public function creditcards() {
        return $this->hasMany('Creditcard');
    }

    public function setPrimary($cardId) {
        return $this->creditcards()->update(['primary' => DB::raw('IF(id='.$cardId.', 1, 0)')]);
    }
}

然后你的代码将是:

$cardholder_id = Input::get('cardholder_id');
$card_id = Input::get('card_id');
$result = Cardholder::find($cardholder_id)->setPrimary($card_id);