首页 > 解决方案 > 我如何创建一个 Laravel API 来根据用户的印象数显示管理员添加的广告?

问题描述

我的 laravel 项目中有一个管理员端,管理员可以在其中添加广告以及展示次数和小时数。例如,如果我添加了一个印象数 = 2 和小时数 = 2 的添加。因此,一旦用户查看了此广告 2 次,则在接下来的 2 小时内将不会向用户显示该广告。

这是管理广告表的结构:

--------------------------------------
 id | image    |impressions| hours |
 1  | image.png|     2     |   6   |
--------------------------------------

还有 ads_impression_log 我存储查看过广告的用户的日志

---------------------------------------------
 id | user_id | ad_id | impression_datetime |
 1  |    1    |   1   | 2020-07-28 23:22:45 |
---------------------------------------------

我如何创建一个 laravel 查询,以便获得特定的广告展示次数,如果展示次数在小时内,则向用户显示下一个广告。

这是我在这里的第一个问题。所以,如果有错误请忽略:)

标签: sqllaraveljoinquery-builder

解决方案


广告模型

public function users(){
     return $this->belongsToMany(App\Add, 'ads_impression_log', 'ad_id', 'user_id')
      ->withPivot('impression_datetime');
}

用户模型

public function ads(){
     return $this->belongsToMany(App\Add, 'ads_impression_log', , 'user_id', 'ad_id')
      ->withPivot('impression_datetime');
}

给定广告的给定用户 ($user_id) 的展示次数。($user_id)

我们将在filter这里使用收集方法。

$user = User::with('ads')->find($user_id);

//
$ads = $user->ads->filter(function($value, $key){
    return $value->id === $ad_id;
});

现在您可以获得这些展示次数。

$count = $ads->count();

该广告所需的展示次数。

$ads->first()->impression;

您可以相应地进行比较。

要从数据透视表中获取印象日期列,您可以执行以下操作。

foreach($ads as $adImp){
    $adImp->pivot->impression_date;
}

推荐阅读