【问题标题】:Laravel Eloquent many to many filter on intermediate tableLaravel Eloquent 中间表上的多对多过滤器
【发布时间】:2016-06-28 08:24:24
【问题描述】:

我在问题中使用了用户/帖子示例。我有两个表用户和帖子链接在一起,与 post_views 作为表的多对多关系。我还创建了一个事件和侦听器来处理帖子上的视图。但我只想添加一个新的视图条目,如果给定帖子的最后一次视图是该用户一个多小时前的视图。

目前我在UpdatePostViews 监听器中的handle() 方法可以:

public function handle(PostWasViewed $event)
{
    $event->post->views()->attach($event->user->id);
}

关系是用withTimestamps 定义的,但是我怎样才能在handle() 方法中过滤来做类似的事情

    $lastView = User::where('user_id', $userId)
->where('post_id', $postId)
->in('post_views')
->orderBy('id', 'DESC')
->first();

这将返回来自post_views 的用户/帖子组合的最后一行,因此我可以确定它在一小时前插入的时间戳并添加新条目或跳过创建新条目。

【问题讨论】:

    标签: php laravel eloquent many-to-many


    【解决方案1】:

    您可以在BelongsToMany 关系上使用wherePivot 方法来为查询的数据透视表添加约束。

    完成此操作后,您可以使用任意逻辑组合来确定过去一小时内是否有视图。比如:

    public function handle(PostWasViewed $event)
    {
        $inLastHour = $event->user->posts()->where('id', $event->post->id)->wherePivot('updated_at', '>=', new \Illuminate\Database\Query\Expression('NOW() - INTERVAL 1 HOUR'))->exists();
    
        // or, either way, shouldn't matter
    
        $inLastHour = $event->post->views()->where('id', $event->user->id)->wherePivot('updated_at', '>=', new \Illuminate\Database\Query\Expression('NOW() - INTERVAL 1 HOUR'))->exists();
    
        if (!$inLastHour) {
            $event->post->views()->attach($event->user->id);
        }
    }
    

    【讨论】:

    • 这也是解决问题的好方法。接受了你的回答,我觉得自己对自己的问题的回答很愚蠢;)就我而言,用户已经存在于 $event 对象中。谢谢! +1
    • 您对我的回答是正确的。我已经删除了我自己的答案,因为它是一个错误的答案。感谢您的进一步解释!
    猜你喜欢
    • 2016-01-22
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    • 2016-03-16
    • 2018-12-14
    相关资源
    最近更新 更多