在Laravel中检索数据

时间:2014-05-19 12:34:29

标签: php laravel eloquent

我找不到解决方案如何检索属于广告系列处于活动状态的用户的链接?

以下是我的模特:

用户模型:

public function links(){
    return $this->hasMany('Link','user_id');
}
public function analytic(){
    return $this->hasManyThrough('Analytic','Link');
}

广告系列模型:

public function task(){
    return $this->hasMany('Task','campaign_id');
}
public function links(){
    return $this->hasManyThrough('Link','Task');
}

任务模型:

public function campaign(){
    return $this->belongsTo('Campaign','campaign_id');
}
public function links(){
    return $this->hasMany('Link','task_id');
}
public function analytic(){
    return $this->hasManyThrough('Analytic','Link');
}

链接模型:

public function task(){
    return $this->belongsTo('Task','task_id');
}
public function user(){
    return $this->belongsTo('User','user_id');
}
public function analytic(){
    return $this->hasMany('Analytic','link_id');
}

因此,管理员创建了一个属于广告系列的广告系列和任务,用户可以启动任务,一旦他们开始执行任务,他们就会为该任务和广告系列分配链接。

在这种情况下,我可以轻松统计所有用户链接:

$user = User::find(1);
echo $user->links->count();

但我的问题是如何只回显与活动广告系列相关的链接。

再次:CAMPAIGN有很多TASK,TASK有很多LINKS,USER有很多LINKS。

获取仅适用于有效广告系列的用户链接数。

与分析相似:(

每个链接都有许多分析(跟踪点击)

分析模型:

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

还需要仅针对活动广告系列中的任务回显链接计数。

1 个答案:

答案 0 :(得分:4)

首先,如果您拥有id,则无需为用户运行查询:

$user=User::find($id); // redundant

// instead
Link::where('user_id', $id)->count();

现在获取有效广告系列的链接:

Link::whereHas('task', function ($q) {
  $q->whereHas('campaign', function ($q) {
     $q->active(); // or where('status', 'active'); see below
  });
})->where('user_id', $id)->get();

// of course you can start with $user->links()->whereHas ... instead

我的示例涵盖广告系列的scope

// Campaign model
public function scopeActive($query)
{
  $query->where('status', 'active');
}

计数也是如此:

Link::whereHas('task', function ($q) {
  $q->whereHas('campaign', function ($q) {
     $q->active();
  });
})->where('user_id', $id)->count();

您也可以将whereHas链包装在范围内:

// Link model
public function scopeOnlyActiveCampaigns($query)
{
  $query->whereHas('task', function ($q) {
    $q->whereHas('campaign', function ($q) {
       $->active();
    });
  });
}

// then simply:
Link::onlyActiveCampaigns()->where('user_id', $id)->count();

正如评论中所述:对关系使用一致的名称,它会让你的生活更轻松:

$link->analytic; // collection, better analytics
$analytic->links; // single Link model, better link etc