Laravel 5.1 查询关系

Laravel 5.1 Querying Relationship

通过构建股票投资组合应用来学习 Laravel。拥有用户、账户、股票、期权和交易的模型。我相信我已经正确建立了关系。

问题是如何获得用户->帐户->交易。我确定我可以在查询生成器中做一些事情,但我希望有更多 "eloquent" 方法。

用户

public function accounts()
{
    return $this->hasMany('App\Account');
}

public function stocks()
{
    return $this->belongsToMany('App\Stock');
}

public function options()
{
    return $this->belongsToMany('App\Option');
}

public function transactions()
{
    return $this->hasMany('App\Transaction');
}

账户

class Account extends Model
{
    protected $fillable = 
    [
        'name',
        'broker'

    ];

    public function user()
    {
        return $this->belongsTo('App\User');
    }

    public function stocks()
    {
        return $this->belongsToMany('App\Stock');
    }

    public function options()
    {
        return $this->belongsToMany('App\Option');
    }

    public function transactions()
    {
        return $this->hasMany('App\Transaction');
    }

交易

class Transaction extends Model
{
    protected $fillable = 
    [
        'type',
        'account_id',
        'transaction_date',
        'quantity',
        'stock_id',
        'option_id',
        'amount',
        'description'

    ];


    public function user()
    {
        return $this->belongsTo('App\User');
    }

    public function stock()
    {
        return $this->belongsTo('App\Stock');
    }

    public function option()
    {
        return $this->belongsTo('App\Option');
    }

    public function account()
    {
        return $this->belongsTo('App\Account');
    }

    public function accounts()
    {
        return $this->hasManyThrough('App\Account', 'App\User');
    }
}

最终,我想我会寻找用户可能拥有的每个帐户的总金额。 (用户可以有很多账户,每个账户会有很多交易、股票和期权。)

感谢您的帮助,或者至少让我知道我是否走在正确的道路上!!

如果 $user 是用户对象,那么 $user->accounts 是 Eloquent 个模型的集合

您可以使用预加载加载所有账户及其交易:

$user->load([
    'accounts',
    'accounts.transactions',
]);

但是 $user->accounts->transactions 不是你可以做的事情,因为 "transactions" 是每个 individual Account 对象的关系,而不是帐户对象集合。因此,要获取您要遍历每个帐户的交易:

foreach ($user->accounts as $account) {
    // do something with $account->transactions;
}

我强烈不建议这样做,正如@alexw 在他的评论中提到的那样,Eloquent 对象非常大并且有 x 很多 x 很多是您加载到内存中的指数级大数据.但通常,这就是您访问关系关系的方式。

你最好使用查询生成器

好消息是关系可以让查询变得非常容易!例如,您可以改为执行以下操作:

注意:在Laravel 5.2中,lists方法已经被pluck

替代
$user->load(['accounts']);

foreach ($user->accounts as $account) {
    $amounts = $account->transactions()->lists('amount');
    $total = $amounts->sum();

    // - or -

    $query = $account->transactions()
        ->select(\DB::raw('SUM(amount) AS total'))
        ->first();
    $total = $query->total;
}