我的laravel项目中有一个管理员端,管理员可以在其中添加广告以及印象和时间。例如,如果我添加一个印象为2、小时为2的add。因此,一旦用户已经观看该广告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(AppAdd, 'ads_impression_log', 'ad_id', 'user_id')
->withPivot('impression_datetime');
}
用户模型
public function ads(){
return $this->belongsToMany(AppAdd, 'ads_impression_log', , 'user_id', 'ad_id')
->withPivot('impression_datetime');
}
给定用户($user_id(对给定广告($user_i(的印象计数
我们将在这里使用收集方法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;
你可以做相应的比较。
要从透视表中获取impression_date列,可以执行以下操作。
foreach($ads as $adImp){
$adImp->pivot->impression_date;
}