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;
}
通过构建股票投资组合应用来学习 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;
}