【问题标题】:Set a row to 1 while others to 0 expressed in Eloquent将一行设置为 1,而将其他行设置为 0,用 Eloquent 表示
【发布时间】:2015-03-03 22:54:54
【问题描述】:

持卡人只能在 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 或查询生成器来表达。非常感谢您。

【问题讨论】:

    标签: php mysql laravel laravel-4 eloquent


    【解决方案1】:

    对于您给定的代码,您只需更改更新语句即可:

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

    对于更类似于 Laravel 的解决方案,如果您的模型和关系设置正确,您可以将此逻辑提取到 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-26
      • 1970-01-01
      • 2018-11-05
      • 2013-01-01
      • 1970-01-01
      • 2014-06-05
      • 2016-09-18
      • 2023-04-02
      相关资源
      最近更新 更多