solaro
V2EX  ›  问与答

laravel ORM 的修改器用来自动换算分和元竟然不生效?

  •  
  •   solaro · Apr 25, 2018 · 2088 views
    This topic created in 2938 days ago, the information mentioned may be changed or developed.

    http://laravelacademy.org/post/7014.html

    我系统中存储单位是分,用户界面展示的是元。 应用场景:商品、用户余额

    现在: 添加新数据( insert )、获取数据( select )没毛病,能自动的 再 insert 的时候 乘 100,select 出来的时候 除 100

    但是问题来了,这个东西竟然不支持 在更新数据的时候( update )自动 乘 100
    使用 自增 increment 和 自减 decrement 不会自动 乘 100

    坛子里有小伙伴们碰到吗

    举例:

    /**
     * 商品
     * Class Goods
     *
     * @package App\Http\Models
     */
    class Goods extends Model
    {
        protected $table = 'goods';
        protected $primaryKey = 'id';
    
        function getPriceAttribute($value)
        {
            return $value / 100;
        }
    
        function setPriceAttribute($value)
        {
            $this->attributes['price'] = $value * 100;
        }
    }
    
    $amount = 10;
    Goods::query()->increment('price', $amount);
    
    希望结果:goods 的 price 加 1000
    实际结果:goods 的 price 只加了 10
    
    6 replies    2018-04-26 11:02:05 +08:00
    ericls
        1
    ericls  
       Apr 25, 2018 via iPhone
    increment 和 setPriceAttribute 都不是一个东西……

    搞不好 increment 还是直接走的数据库 做的 atomic
    justfindu
        2
    justfindu  
       Apr 25, 2018
    不好判断啊, 他只是在更新时候把属性值 * 100, 但是你这个增减的话, 它是把你的变更数值增减 * 100 , 还是把你原来数据 * 100 增减, 还是把你计算完的数据增减 * 100 , 完全不好判断.
    vex2
        3
    vex2  
       Apr 25, 2018
    vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php
    3IOhG7M0knRu5UlC
        4
    3IOhG7M0knRu5UlC  
       Apr 25, 2018 via Android
    看看代码如何实现就几道了
    2ME
        5
    2ME  
       Apr 25, 2018   ❤️ 1
    increment 走的是 QueryBuilder 并不是 ORM 操作 所以并不会经过 ORM 的修改器
    solaro
        6
    solaro  
    OP
       Apr 26, 2018
    @2ME 感谢,花点时间看了框架,看了下明白了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1284 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 58ms · UTC 23:43 · PVG 07:43 · LAX 16:43 · JFK 19:43
    ♥ Do have faith in what you're doing.