[英]Laravel count related data
我在数据库中:
Campaigns
hasMany Tasks
hasMany Links
hasMany LinkClicks
如果我查询
Campaign::find(1)->task->count();
它返回分配给该活动的正确任务数。 但是,如何计算广告系列ID中的链接点击次数?
广告系列模型:
public function task(){
return $this->hasMany('Task','campaign_id');
}
任务模型:
public function campaign(){
return $this->belongsTo('Campaign','campaign_id');
}
public function links(){
return $this->hasMany('Link','task_id');
}
链接模型:
public function task(){
return $this->belongsTo('Task','task_id');
}
public function clicks(){
return $this->hasMany('LinkClick', 'link_id');
}
public function user(){
return $this->belongsTo('User','user_id');
}
LinkClick模型:
public function link(){
return $this->belongsTo('Link','link_id');
}
因此,我只想为特定广告系列下的链接计算linkClicks,无论是哪个任务或链接,当然该任务和链接都必须位于指定广告系列下。
将hasManyThrough
用于链接:
// Campaign model
public function links()
{
return $this->hasManyThrough('Link', 'Task');
}
// then you can fetch the count either querying db:
$campaign->links()->count(); // SELECT COUNT(*) ...
// returns STRING '25'
// or from the collection of already loaded relation:
$campaign->links->count(); // counts collection items
// returns INT 25
对于LinkClicks,这将无法继续进行,但是yuou也可以通过一种简单的方法来实现这一点:
// This is another way for the above:
$campaign = Campaign::with('tasks.links')->find($someId);
$campaign->tasks->fetch('links')->collapse()->count(); // INT 25
// and the LinkClicks:
$campaign = Campaign::with('links.clicks')->find($someId);
$campaign->links->fetch('clicks')->collapse()->count(); // INT 555
由于下去,它们都是“ hasMany”关系,因此您将需要遍历每个级别上的所有子级以产生总和。 这样的事情应该为您工作:
$campaign = Campaign::find($campaignId);
$count = 0;
foreach($campaign->task as $task) {
foreach($task->link as $link) {
$count += $link->click->count();
}
}
echo 'Clicks for campaign id ' . $campaignId . ': ' . $count . "\n";
或者,您可以跳过所有操作,而只对数据库发出一条裸露的语句:
$results = DB::select(
'SELECT \'a\' FROM campaign c
INNER JOIN task t ON t.campaign_id = c.id
INNER JOIN links l ON t.task_id = t.id
INNER JOIN link_clicks lc ON lc.link_id = l.id'
);
不过,第一个想法可能是一个更好的想法。
由于您正在使用关系; 您可以执行以下操作:
$count = 0;
$campaign_with_tasks = Campaign::with('tasks')->where('id','=',$campaign_id)->get();
foreach($campaign_with_tasks->tasks as $task){
$links = Links::where('task_id','=',$task->id)->get();
foreach($links as $link){
$count += LinkClicks::where('link_id','=',$link->id)->count();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.