Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel 5.1查询关系_Laravel_Eloquent_Relationships - Fatal编程技术网

Laravel 5.1查询关系

Laravel 5.1查询关系,laravel,eloquent,relationships,Laravel,Eloquent,Relationships,通过构建股票投资组合应用程序学习Laravel。拥有用户、账户、股票、期权和交易的模型。我相信我已经建立了良好的关系 问题是如何获得用户->帐户->交易。我确信我可以在QueryBuilder中做一些事情,但我希望有一种更“雄辩”的方法 使用者 帐目 class Account extends Model { protected $fillable = [ 'name', 'broker' ]; public function

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

问题是如何获得用户->帐户->交易。我确信我可以在QueryBuilder中做一些事情,但我希望有一种更“雄辩”的方法

使用者

帐目

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
就是一组雄辩的模型

您可以通过即时加载加载所有帐户及其事务:

$user->load([
    'accounts',
    'accounts.transactions',
]);
但是,
$user->accounts->transactions
不是您可以做的事情,因为“transactions”是每个个人
帐户
对象上的关系,而不是帐户对象的集合上的关系。因此,要获得交易,您需要通过每个帐户进行循环:

foreach ($user->accounts as $account) {
    // do something with $account->transactions;
}
我强烈不建议这样做,正如@alexw在他的评论中提到的,有说服力的对象非常大,并且有x多x多是加载到内存中的数据量的指数级。但一般来说,这就是你如何访问关系的关系

最好使用查询生成器

好消息是,关系可以让查询变得非常容易!例如,您可以这样做:

注意:在Laravel 5.2中,
列表
方法已替换为
弹拨

$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;
}

看来查询生成器方法将是一种可行的方法。否则,您将最终将每个
事务
对象加载到内存中,而实际上您需要的只是每个帐户的聚合值。我有点担心这一点。这个想法是让一个页面列出一个用户的所有单独帐户,并有余额,然后单击该帐户打开一个页面,列出所有交易。对于特定的股票也是如此。您可以看到用户的总库存量,然后按帐户进行拆分,然后在每个帐户中分别显示涉及该库存的交易列表。谢谢您的帮助。我会接受你的建议。您给出的最后一个示例返回了一个总数,并向我演示了如何使用。就为了让我理解这个过程,如果我使用渴望加载的例子,它是否只为该用户加载所有数据?或者加载所有用户及其事务,然后筛选出请求的用户。我的观点是,如果它只返回一个用户,那么数据可能没有那么大,但是如果它将所有用户放入内存,那么就会拉出请求的用户,这肯定是巨大的。再次感谢你们两位@BrioDev它只加载该用户的数据。你说它“可能没有那么大”,但总是考虑长期和边缘的情况。也许2年后会有很多数据,即使只是一个用户。或者你有一个用户做了大量的交易,绝对正确。非常感谢你。我的下一个任务是学习React,并打算使用它来更新价格和排序视图等。我想也许将所有数据作为一块发送给它可能是一种方法,然后让它将所有内容排序到视图为止。我相信更小的JSON会更容易管理。还有很多东西要学,很高兴知道有像你这样的人愿意帮忙!!非常感谢,不客气。除了接受我的回答,如果你也给我投票,那就太好了:)
$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;
}