sql - 我如何创建一个 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 查询,以便获得特定的广告展示次数,如果展示次数在小时内,则向用户显示下一个广告。
这是我在这里的第一个问题。所以,如果有错误请忽略:)
解决方案
广告模型
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;
}
推荐阅读
- sql-server - org.hibernate.exception.SQLGrammarException:将 nvarchar 值“ViewWebApp”转换为数据类型 int 时转换失败
- php - DateTime('now') 在 sleep() 之后未修改
- azure-active-directory - 迁移到 .net5 后的 Blazor webassembly azure 广告身份验证问题
- postgresql - 如何在 dbeaver 中为 Postgresql 配置主客户端
- python - 在花园 Python 练习中放置 gnome
- javascript - 将用户点击推送到数组,然后在 Javascript 中设置时间后显示数组?
- python - 如何让我的鼠标左键在 tkinter、python 的棋盘井字游戏中画一个圆圈
- flutter - 在 Flutter 中制作唯一 ID 列表平铺
- javascript - ReferenceError: con 未定义
- excel - Excel VBA:将图片移动到另一张纸而不复制/粘贴