【问题标题】:Get specific field from one to many table relationship with laravel eloquent?使用 laravel eloquent 从一对多表关系中获取特定字段?
【发布时间】:2020-07-12 03:50:50
【问题描述】:

我有如下图所示的表格:

所以,用户有很多balance_transactions,最后插入的balance_transactions 记录将是用户帐户余额。我的问题,如何使 user model 具有属性 account_balance ,其值最后插入 totalbalance_transactions 表中

我尝试在用户模型中使用类似的东西

public function balance {
    return $this->hasMany(App\BalanceTransaction::class);
}

public function account_balance {
    return $this->balance()->orderBy('id', 'DESC')->limit(1);
}

我得到这样的数据

$user = User::where('id', 1)->with('account_balance')->first();
return response()->json($user);

结果如下 json 所示:

{
   "id": 1,
   "username": "john0131",
   "full_name": "john doe",
   "email": john@test.com,
   "account_balance": [
      {
          "id": 234,
          "user_id": 1,
          "total": 7850
          "added_value": 50
          "created_date": "2020-02-28 12:18:18"
      }
   ]
}

但我想要的是,返回应该是这样的下面的json:

{
   "id": 1,
   "username": "john0131",
   "full_name": "john doe",
   "email": "john@test.com",
   "account_balance": 7850
}

我的问题,如何以 laravel eloquent 正确的方式制作这样的东西?所以我只能使用像$user = user::find(1); 这样的简单代码来获取account_balance 数据。

提前致谢

【问题讨论】:

    标签: laravel eloquent one-to-many laravel-6 eloquent-relationship


    【解决方案1】:

    我建议只从您的事务表中加载一行,同时着眼于性能。此外,您可以将访问器的值附加到模型的序列化输出(例如__toArray()),并仅在关系已加载时才返回实际​​值。

    class User extends Authenticatable
    {
        protected $appends = ['account_balance'];
    
        public function balance()
        {
            return $this->hasMany(App\BalanceTransaction::class);
        }
    
        public function latestBalance()
        {
            return $this
                ->hasOne(App\BalanceTransaction::class)
                ->latest();
        }
    
        public function getAcountBalanceAttribute()
        {
            if (! $this->relationLoaded('latestBalance')) {
                return null;
            }
    
            return $this->latestBalance->total;
        }
    }
    

    【讨论】:

    • 我不知道为什么 !$this->relationLoaded('latestBalance') 总是返回 false .. 但只要稍加修改就可以了...非常感谢 Dan
    • 嘿,我发现了我的错误。我错误地命名了关系的方法。如果您现在急切加载关系,它应该可以正常工作。
    • 哦...好的@Dan ...提前致谢
    【解决方案2】:

    解决这个问题的一种方法是,你可以使用 laravel Accessors

    所以在你的用户模型中你可以创建一个方法如下

    /**
     * Get the user's balance.
     *
     * @return float
     */
    public function getAccountBalanceAttribute()
    {
        return $this->balance->last()->total;
    }
    

    然后,无论您想使用它,您都可以通过以下方式使用它: $user->account_balance;

    【讨论】:

    • 这样不行。访问器可能是一种方式,但您必须记住 balance-relation 返回一个集合。
    • @丹。是的,谢谢指出。然后我们可以在集合上使用 last() 方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    • 2021-12-30
    • 2013-02-09
    • 2017-12-19
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    相关资源
    最近更新 更多