Laravel Eloquent 关系从其他关系中获取一列 table

Laravel Eloquent Relationship get one column from other table

我有关于 Laravel Eloquent 的问题。

我有以下 tables

Users
    -id
    -email

Money
    -id
    -user_id
    -amount
    -total

用户有很多钱

我想使用 $user->current_money 然后我想得到最后一笔钱的总数

我需要这个因为我想在 table

中显示所有用户当前的钱
@foreach($users as $user)
    <tr>
        <td>{{$user->email}}</td>
        <td>{{$user->current_money}}</td>
    </td>
@endforeach

有什么好的做法吗?

谢谢

我喜欢在 Laravel Eloquent 中使用追加来实现这一点。

在您的用户模型中添加 $appends 数组。像这样

protected $appends = ['current_money'];

这将在用户模型中查找方法 getCurrentMoneyAttribute()。它应该看起来像这样。

public function getCurrentMoneyAttribute()
{

    return 0.00;

}

这意味着您已经植入了 User 表和 Money 表之间的关系。你的方法应该是这样的,

public function getCurrentMoneyAttribute()
{

    return $this->money()->latest()->first()->total;

}

以及何时调用 $user->current_money laravel 执行查询,它将获得与该用户相关的 Money 的最后一行。

您可以使用您所询问的 Eloquent 关系和单个查询来完成此操作。使用 append 是一个滑坡,因为现在它会将其添加到所有用户查询中,并且随着应用程序的增长可能会导致膨胀。除了追加之外,它将有 2 个查询而不是一个查询。

在用户模型中,您可以这样定义关系:

/**
 * Get money for a user
 */
public function money()
{
    return $this->hasMany('App\Money', 'user_id', 'id');
}

然后你可以在单个查询中像这样查询用户的性能:

$user = User::where('id', $id)->with(['money'])->first();

$user = User::with('money')->findOrFail($id);

或者现在您也可以预加载钱,因为现在在用户模型中定义了关系。

$user = Auth::user(); // or however you are pulling the user from the DB.
$user->money;

然后遍历不同的货币。