🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Q&A

解決済

1回答

2589閲覧

Laravelで初回ログイン時にだけ特殊な処理をしたい。

Tikka123456

総合スコア34

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

0グッド

0クリップ

投稿2020/12/26 00:59

ログインしているときに投票できて24時間後に再投票できるシステムを作っているのですが、
現時点だと初回ログイン時の際投票できない使用になっています。
恐らく原因はinitialLoginTimeの初期値がfalseで固定されていて初めて投票するときが対象外になってしまう事だと思うのですが、初回ログイン時でも正常に投票できるように柔軟な処理を実装したいです。
どうかよろしくお願いします。

ArticleVote.vue

<template> <div> <button type="button" class="btn m-0 p-1 btn-peach-gradient" @click="clickVote" > </button> {{ countVotes }} </div> </template> <script> export default { props:{ initialIsVotedBy: { type: Boolean, default: false, }, initialCountVotes: { type: Number, default: 0, }, authorized: { type: Boolean, default: false, }, endpoint: { type: String, }, initialLoginTime: { // 初期値はログインしてから24時間経っていない(false) type: Boolean, default: false, }, }, data(){ return { isVotedBy: this.initialIsVotedBy, countVotes: this.initialCountVotes, loginTime: this.initialLoginTime, } }, methods: { clickVote() { if(!this.authorized) { alert('投票はログイン中のみ使用できます') return }else if(this.initialLoginTime === false) //ログインしてから24時間後かどうか判定しています。 { alert('投票できるのは24時間後です') } this.isVotedBy ? this.notvote() :this.vote() }, async vote() { const response = await axios.put(this.endpoint) this.isVotedBy = true this.loginTime = true this.countVotes = response.data.countVotes }, notvote() { alert('すでに投票済みです') }, }, } </script>

Article.php

<?php namespace App; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsToMany; use App\User; use Carbon\Carbon; class Article extends Model { public function isVotedBy(?User $user): bool { return $user ?(bool)$this->votes->where('id', $user->id)->count() :false; } public function getCountVotesAttribute(): int { return $this->votes->count(); } public function loginTime(?User $user): bool //ログインしてから24時間後かどうかを判定 { $end = Carbon::now(); $start = $end->subHour(24); return $user ? (bool)$this->votes->where('id', $user->id)->whereBetween("last_login_at", [$start, $end]) :false; } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

これそもそもログインした時間を記録してるのが間違いで
「最後に投票した時間」を記録しておけばいいだけ。

「最後に投票した時間」から24時間以上経過していれば許可。
「最後に投票した時間」がnullなら初めての投票なので許可。

別に自分で作る必要もなくLaravelのレート制限で「ユーザー毎に24時間に1回だけ許可」は実現できる。

投稿2020/12/26 05:00

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tikka123456

2020/12/27 03:13

回答ありがとうございます!最後に投票した時間というのは盲点でした。 ユーザー毎に24時間に1回だけ許可というのはthrottleを使うのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問