как такое реализовать?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
cqfmkapb
Сообщения: 162
Зарегистрирован: 2019.12.08, 15:49

как такое реализовать?

Сообщение cqfmkapb »

Код: Выделить всё

public function actionEveryday()
    {

        $person = Person::findOne(Yii::$app->user->identity->id);
        $userHistory = new HistoryRating();
//echo "$userHistory =HistoryRating::findOne(Yii::$app->user->identity->created_at";

        $userHistory->user_id = Yii::$app->user->identity->id;

        $userHistory->rating = $this->rating;
        $userHistory->type = 'everyday';
        $userHistory->comment = 'everyday';
//        var_dump(HistoryRating::findOne('created_at'));
//        var_dump(SELECT created_at FROM history_ratin);

//        var_dump(HistoryRating::find(id)->created_at);
        var_dump(Yii::$app->history_rating);
        $userHistory->save();
        $upd = $person->updateCounters(['rating' => $this->rating]);
//        var_dump(Yii::$app->history_rating->identity->created_at);

        return $upd;
    }
я хочу реализовать, чтоб если пользователь сегодня уже обновил страницу и рейтинг добавился, то сегодня не добавлялся. Чтоб рейтинг добавлялся через сутки.
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: как такое реализовать?

Сообщение unknownby »

Сделай проверку на дату и id пользователя, если есть в БД, то убери возможность проставления рейтинга для него.
cqfmkapb
Сообщения: 162
Зарегистрирован: 2019.12.08, 15:49

Re: как такое реализовать?

Сообщение cqfmkapb »

можно пример как такое реализовать?
Rodman
Сообщения: 52
Зарегистрирован: 2018.06.01, 20:33
Контактная информация:

Re: как такое реализовать?

Сообщение Rodman »

Тебе нужно добавить в таблицу уникальный индекс по полям id_user+date_update (типа DATE)

Код: Выделить всё

CREATE UNIQUE INDEX index_name
ON table_name(index_column_1,index_column_2,...);
И при добавлении рекомендую делать не просто INSERT, a INSERT IGNORE, чтобы ошибку не выбрасывало
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: как такое реализовать?

Сообщение yiiliveext »

Если created_at хранится в int(11) UTC

Код: Выделить всё

    $timeZone = Yii::$app->getTimeZone();
    Yii::$app->setTimeZone('UTC');
    $beginOfDay = strtotime("midnight", time());
    $endOfDay = strtotime("tomorrow midnight", time()) - 1;
    Yii::$app->setTimeZone($timeZone);
    $user = Yii::$app->user;
    $todayRating = HistoryRating::find()
        ->where(['user_id' => $user->id])
        ->andWhere(['>=', 'created_at', $beginOfDay])
        ->andWhere(['<=', 'created_at', $endOfDay])
        ->one();
    if ($todayRating) {
        return 'Рейтинг пользователя сегодня уже был обновлен';
    }    
        
cqfmkapb
Сообщения: 162
Зарегистрирован: 2019.12.08, 15:49

Re: как такое реализовать?

Сообщение cqfmkapb »

Код: Выделить всё

public function actionEveryday()
    {

        $person = Person::findOne(Yii::$app->user->identity->id);
        $userHistory = new HistoryRating();
//echo "$userHistory =HistoryRating::findOne(Yii::$app->user->identity->created_at";

        $userHistory->user_id = Yii::$app->user->identity->id;

        $userHistory->rating = $this->rating;
        $userHistory->type = 'everyday';
        $userHistory->comment = 'everyday';
//        var_dump(HistoryRating::findOne('created_at'));
//        var_dump(SELECT created_at FROM history_ratin);

//        var_dump(HistoryRating::find(id)->created_at);
//        var_dump(Yii::$app->history_rating);
        var_dump($userHistory->created_at);
        $userHistory->save();
        $upd = $person->updateCounters(['rating' => $this->rating]);
//        var_dump(Yii::$app->history_rating->identity->created_at);

        $timeZone = Yii::$app->getTimeZone();
        Yii::$app->setTimeZone('UTC');
        $beginOfDay = strtotime("midnight", time());
        $endOfDay = strtotime("tomorrow midnight", time()) - 1;
        Yii::$app->getTimeZone($timeZone);
        $user = Yii::$app->user;
        $todayRating = HistoryRating::find()
            ->where(['user_id' => $user->id])
            ->andWhere(['>=', 'created_at', $beginOfDay])
            ->andWhere(['<=', 'created_at', $endOfDay])
            ->one();
        id ($todayRating) {
        return 'Рейтинг пользователя сегодня уже был обновлен';
    }

        return $upd;
    }
{
"name": "Exception",
"message": "syntax error, unexpected 'return' (T_RETURN)",
"code": 0,
"type": "ParseError",
"file": "/web/yii2/api/modules/v1/controllers/RatingController.php",
"line": 66,
"stack-trace": [
"#0 [internal function]: yii\\BaseYii::autoload('api\\\\modules\\\\v1\\\\...')",
"#1 [internal function]: spl_autoload_call('api\\\\modules\\\\v1\\\\...')",
"#2 /web/yii2/vendor/yiisoft/yii2/base/Module.php(637): class_exists('api\\\\modules\\\\v1\\\\...')",
"#3 /web/yii2/vendor/yiisoft/yii2/base/Module.php(596): yii\\base\\Module->createControllerByID('rating')",
"#4 /web/yii2/vendor/yiisoft/yii2/base/Module.php(588): yii\\base\\Module->createController('everyday')",
"#5 /web/yii2/vendor/yiisoft/yii2/base/Module.php(522): yii\\base\\Module->createController('rating/everyday')",
"#6 /web/yii2/vendor/yiisoft/yii2/web/Application.php(103): yii\\base\\Module->runAction('v1/rating/every...', Array)",
"#7 /web/yii2/vendor/yiisoft/yii2/base/Application.php(386): yii\\web\\Application->handleRequest(Object(yii\\web\\Request))",
"#8 /web/yii2/api/web/index.php(17): yii\\base\\Application->run()",
"#9 {main}"
]
}
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: как такое реализовать?

Сообщение yiiliveext »

Там не id а if, я исправил в коде.
И добавлять надо в самое начало метода.

Код: Выделить всё

public function actionEveryday()
{
    $timeZone = Yii::$app->getTimeZone();
    Yii::$app->setTimeZone('UTC');
    $beginOfDay = strtotime("midnight", time());
    $endOfDay = strtotime("tomorrow midnight", time()) - 1;
    Yii::$app->setTimeZone($timeZone);
    $user = Yii::$app->user;
    $todayRating = HistoryRating::find()
        ->where(['user_id' => $user->id])
        ->andWhere(['>=', 'created_at', $beginOfDay])
        ->andWhere(['<=', 'created_at', $endOfDay])
        ->one();
    if ($todayRating) {
        return 'Рейтинг пользователя сегодня уже был обновлен';
    }    

    $person = Person::findOne(Yii::$app->user->identity->id);
    $userHistory = new HistoryRating();
    $userHistory->user_id = Yii::$app->user->identity->id;
    $userHistory->rating = $this->rating;
    $userHistory->type = 'everyday';
    $userHistory->comment = 'everyday';
    $userHistory->save();
    $upd = $person->updateCounters(['rating' => $this->rating]);

    return $upd;
}
Можно еще добавить ->andWhere(['type' => 'everyday' ]) если оно надо по логике.
Последний раз редактировалось yiiliveext 2019.12.09, 10:55, всего редактировалось 1 раз.
cqfmkapb
Сообщения: 162
Зарегистрирован: 2019.12.08, 15:49

Re: как такое реализовать?

Сообщение cqfmkapb »

добавил и заработало. как понять логику Вашего решения. Я учусь и хочу научиться. Хочу , чтоб сам потом смог сделать. что для этого нужно сделать?
cqfmkapb
Сообщения: 162
Зарегистрирован: 2019.12.08, 15:49

Re: как такое реализовать?

Сообщение cqfmkapb »

спасибо за решение
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: как такое реализовать?

Сообщение yiiliveext »

cqfmkapb писал(а): 2019.12.09, 10:54 добавил и заработало. как понять логику Вашего решения. Я учусь и хочу научиться. Хочу , чтоб сам потом смог сделать. что для этого нужно сделать?
Заходите на https://www.unixtimestamp.com и смотрите значения $beginOfDay, $endOfDay, $todayRating->created_at
cqfmkapb
Сообщения: 162
Зарегистрирован: 2019.12.08, 15:49

Re: как такое реализовать?

Сообщение cqfmkapb »

$beginOfDay куда там вводить?
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: как такое реализовать?

Сообщение yiiliveext »

cqfmkapb писал(а): 2019.12.09, 11:14 $beginOfDay куда там вводить?
Enter a Timestamp:
cqfmkapb
Сообщения: 162
Зарегистрирован: 2019.12.08, 15:49

Re: как такое реализовать?

Сообщение cqfmkapb »

Month must be at least 1!
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: как такое реализовать?

Сообщение yiiliveext »

cqfmkapb писал(а): 2019.12.09, 11:19 Month must be at least 1!
ИзображениеИзображение
cqfmkapb
Сообщения: 162
Зарегистрирован: 2019.12.08, 15:49

Re: как такое реализовать?

Сообщение cqfmkapb »

понял а я вставлял $beginOfDay
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: как такое реализовать?

Сообщение yiiliveext »

cqfmkapb писал(а): 2019.12.09, 11:33 понял а я вставлял $beginOfDay
Выведите значения в дебагер или прямо верните

Код: Выделить всё

if ($todayRating) {
        return 'Рейтинг пользователя сегодня уже был обновлен (beginOfDay: ' . $beginOfDay  . ', endOfDay: ' . $endOfDay . ', created_at:' . $todayRating->created_at . ')';
    }   
Последний раз редактировалось yiiliveext 2019.12.09, 11:57, всего редактировалось 2 раза.
cqfmkapb
Сообщения: 162
Зарегистрирован: 2019.12.08, 15:49

Re: как такое реализовать?

Сообщение cqfmkapb »

"Рейтинг пользователя сегодня уже был обновлен (beginOfDay: 1575849600, еndOfDay: , created_at:1575874257)"1575504000
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: как такое реализовать?

Сообщение yiiliveext »

cqfmkapb писал(а): 2019.12.09, 11:52 "Рейтинг пользователя сегодня уже был обновлен (beginOfDay: 1575849600, еndOfDay: , created_at:1575874257)"1575504000
В $endOfDay русская 'е' стояла, исправьте
cqfmkapb
Сообщения: 162
Зарегистрирован: 2019.12.08, 15:49

Re: как такое реализовать?

Сообщение cqfmkapb »

все равно не добавляется если дату изменить
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: как такое реализовать?

Сообщение yiiliveext »

cqfmkapb писал(а): 2019.12.09, 12:25 все равно не добавляется если дату изменить
Так обмануть не получится)
Вы дату меняете на клиенте, а в экшине дата берется на сервере
Завтра попробуйте :lol:
Но это, если у вас сервер и клиент разнесены, если локально, то должно работать.
Ответить