簡體   English   中英

Laravel在中間表上雄辯地進行多對多過濾

[英]Laravel Eloquent many to many filter on intermediate table

我在問題中使用“用戶/帖子”示例。 我有兩個表Users和Posts鏈接在一起,並且與post_views作為表存在多對多關系。 另外,我還創建了一個Event和Listener來處理帖子中的視圖。 但是,我只想在給定帖子的最后一個視圖是該用戶一個小時前添加的情況下添加一個新的視圖條目。

目前,我在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用戶/帖子組合的最后一行,因此我可以確定一個小時前插入的時間戳,並添加新條目或跳過創建新條目。

您可以使用wherePivot的方法BelongsToMany關系在樞軸表中添加約束查詢。

完成此操作后,您可以使用任何邏輯組合來確定最近一小時是否有視圖。 就像是:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM