【问题标题】:Retrieving data in Laravel在 Laravel 中检索数据
【发布时间】:2014-07-07 10:07:42
【问题描述】:

我找不到解决方案如何检索属于活动活动的用户的链接?

这是我的模型:

用户模型:

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');
}

还需要仅针对处于活动活动中的任务回显链接计数。

【问题讨论】:

  • 什么定义了有效的广告系列?
  • 在表格广告系列中,我有列 STATUS,它可以是“活动”或“被阻止”。
  • 您没有使用一致的命名约定来定义模型中的关系。
  • hasMany & hasManyThrough => 复数形式

标签: php laravel eloquent


【解决方案1】:

首先,如果您有用户的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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    • 2017-10-17
    • 2020-06-10
    • 1970-01-01
    相关资源
    最近更新 更多