Php 拉威尔计数相关数据

Php 拉威尔计数相关数据,php,laravel,eloquent,Php,Laravel,Eloquent,我的数据库中有: Campaigns hasMany Tasks hasMany Links hasMany LinkClicks $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

我的数据库中有:

Campaigns
    hasMany Tasks
        hasMany Links
            hasMany LinkClicks
$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'
);
如果我质疑

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');
}
链接点击模式:

public function link(){
    return $this->belongsTo('Link','link_id');
}

因此,我只想计算特定活动下链接的点击次数,无论是哪个任务或链接,当然该任务和链接都需要在指定的活动下。

因为它们都是“有很多”关系,所以您需要迭代每个级别的所有子级以生成总和。这样的事情应该适合你:

$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";
或者,您可以跳过所有这些,只需对数据库发出一条简单的语句:

Campaigns
    hasMany Tasks
        hasMany Links
            hasMany LinkClicks
$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'
);

不过,第一个想法可能更好。

因为它们都是“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";
或者,您可以跳过所有这些,只需对数据库发出一条简单的语句:

Campaigns
    hasMany Tasks
        hasMany Links
            hasMany LinkClicks
$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();
}
}

因为你在使用关系;您可以这样做:

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

对链接使用
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
对于链接点击,这不会进一步起作用,但您也可以通过简单的方法实现这一点:

// 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

对链接使用
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
对于链接点击,这不会进一步起作用,但您也可以通过简单的方法实现这一点:

// 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

很重要的一点是,我和哈斯曼的关系有一些问题,但我相信这消除了我的疑虑。非常精确。谢谢。很好的分享,我和我这边的许多亲戚有一些问题,但我相信这消除了我的疑虑。非常精确。谢谢。这将在这些循环中大量查询DB,除非您使用急切加载。这将在这些循环中大量查询DB,除非您使用急切加载。