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