Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
...->paginate($perPage)
когда этот необязательный параметр пропущен, то внутри метода paginate() вычисяется как
$perPage = $perPage ?: $this->model->getPerPage();
...
public function getPerPage()
{
return $this->perPage;
}
то есть можнро задать значение по умолчанию для конкретной модели.
P.S. Используй хорошую IDE и смотри её подсказки, прыгай в определение методов!
@if(Cache::has('user-online' . $user->id))
можно заменить на
@if( $user->last_seen->greaterThan(now()->subMinutes(ONLINE_TIMEOUT)) )
будет также работать ->gt(x) : https://carbon.nesbot.com/docs/#api-comparison
да и просто сравнение ">", но это вроде бы недокументированная фича PHP
Здесь я подразумеваю что last_seen у тебя автоматически тайпкастится в Carbon. Потому что так принято в Laravel
— This is the way. May the force be with you.
"Last seen" читается как "Последний раз видели". Сохраняй просто now(). Время последнего визита пользователя не зависит от величины таймаута для вычисления кто онлайн. Логика!!!
А в контроллере вычисляй время назад, то есть отнимай от текущего. Типа
User::where('last_seen', '>', now()->subMinutes(ONLINE_TIMEOUT))->count()
Еще раз: кеш здесь не нужен. Кеш кроме того что необязателен, еще не имеет смысла там, где постоянно происходит обновление. Он оптимизирует ситуацию когда редко пишется и часто читается. И при отсутствии нужных данных в кеше приложение должно выдавать те же результаты! (только может быть немного медленнее) Если у тебя не так, то это логическая ошибка.
Кеш по определению нечто необязательное, может отсутствовать в любой момент. Поэтому применять его таким образом нелогично.
Статус онлайн пользователя определяют через сохранение отметки о его последнем визите. Например в самой таблице пользователей или в специальной таблице. И считаем что пользователь онлайн если он был здесь не более 10 минут назад, к примеру.
Код, который ты цитируешь, "в котором берётся api_token" на самом деле служит для аутентификации по токену. То есть когда правильный токен присутствует в запросе, то в программе будет доступен "текущий пользователь". Вот что там происходит!
Надо полагать, теперь тебе в контроллере надо читать этого юзера, возможно проверять его права доступа и принимать решение давать или не давать. Сам токен тебе уже больше нигде не нужен.
Как мне им воспользоваться в контролёре app/Http/Controllers/AuthorController.php ?
как в документации написано:
$user = Auth::user();
или
$user = $request->user();
Мне нужно посмотреть пришёл ли вместе с post или get запросом APP_KEY и в зависимости от этого продолжить выполнение метода или вернут 403 ошибку если APP_KEY не пришёл.
API_KEY не так работает. Ты путаешь ключ и токен. Ключ используется скриптами для шифрования или подписывания какой-то информации. Используется для создания токенов доступа. Буквально сам ключ не передается никуда!
Советую делать по инструкции из официальной документации. Разделы Authentication, Authorization
Нет, про копирование id в path речи не было. Но ты можешь попробовать это.
Уже пора пробовать, @kull88, давай дальше сам.
Например если хранить путь как это принято в Materialized Paths, это будет очень похоже на оглавление в книге.
Я здесь оставил поле parent_id только чтобы тебе было понятнее как они между собой связаны. Для технологии это MP не нужно.
id parent_id path
-- --------- ----
1 null '1.'
2 1 '1.1.'
3 1 '1.2.'
4 2 '1.1.1.'
5 4 '1.1.1.1.'
. . .
Запрос посчитает количество дочерних узлов для id=2 (+1 т.к. сам узел тоже посчитан)
SELECT COUNT(*)
FROM users
WHERE path LIKE '1.1.%'
Это называется дерево ))) А отношения между пользователями такие обычно при участии в реферальной программе. Но ничего этого не прозвучало )))
Есть несколько эффективных методов хранения древовидных структур - Nested Sets, Materialized (или Storing) Paths, Closure Tables... они позволяют в один запрос к базе получить количество дочерних узлов или добыть сами узлы.
А для id - parent_id (т.н. Adjacency List), такое невозможно. Теперь ты знаешь какие слова гуглить.
Не за что!
DirectoryIndex public/index.php
и
RewriteRule ^(.*)$ public/index.php [L]
как бы намекают что у тебя сайт (был) настроен не на месте. или на месте но не настроен ))) потому что корень сайта уже должен быть в папке public и значит слова public уже не должно появляться в .htaccess
если ты что-то решил у себя, то поделись с другими. не веди себя как будто тебе здесь должны, а ты ничего не должен. мы все в одном положении!
Друг, чтобы программировать надо научиться вопросы задавать внятно. Я несколько раз перечитывал и не понял в чем затруднение. Вот это просто шедевр:
где id=3 потом взять id где равен 3 и пройти дальше.
куда тебе надо пойти?
Общее количество записей добывается если убрать условие where(), оставить только count()
Через отношения или чтобы имена не светились? Это разные задачи.
Если буквально хочешь использовать отношения, то смотри в доках методы with, withCount. Это не равноценно join, т.е. будет другой запрос, но цель возможно будет достигнута.
Если надо взять имя таблицы из определения класса-модели, то сам Тейлор совтует делать так: with(new Model)->getTable();
https://laravel.com/docs/8.x/migrations … ng-indexes
$table->unique(['user_id', 'group_at']);
Странно что нет метода create. Покажи свой класс User. И скопируй сюда об ошибке как оно есть буквально.
[offtopic]
не налегай сильно на видеоуроки. они приучают отключать голову и просто копировать текст. чтобы росли скиллы в программировании, надо себя напрягать - как с мышцами.
[/offtopic]
@loren, про расширения vs не знаю, так как не пользуюсь. А про открытие artisan через open server - он и не должен работать в веб-сервере как php! Потому что у него нет расширения. Странно что ты вообще имеешь к нему доступ через веб-сервер, ведь он должен быть за пределами Document Root. Надо настроить сайт так, чтобы он начинался с папки public, а не с корня проекта.
Сейчас все это берется из БД. Соответственно, в каждом таком инклуде я вызываю метод контроллера для получения нужных данных.
Вот это неожиданный переход. Почему именно метод контроллера? ))) По классике данные доставляются в представление через параметры вызова view. Если этого мало - есть View Composer. А если прям сильно хочется обращаться к чьим-то методам, то в шаблоне можно добывать некий сервис через @inject и обращаться к его методам.
Я бы таки ограничился параметрами вьюхи. Из главного представления в инклуды передавал бы нужные им параметры.
Есть еще компоненты это типа "умные инклуды".
Будь я админ, я б тебя забанил за ссылки в первом же посте. )))
В программировании самое важное это умение внятно сформулировать цель. Без этого будет просто трата времени и сил. Весь твой пост это пример невнятности.
Роутом (маршрутом) обычно называют соответствие URL и обработчика. То что описано в routes/web.php. А не функция route().
Такие варианты не срабатывают
Потому что не должны. Не надо стрелять вслепую. Надо осмысленно писать код, зная синтаксис.
Если у тебя проблема с подстановкой значений в строку, то бд здесь скорее всего не при чем. Почитай документацию про строки в PHP. Про шаблоны в Laravel. Попробуй так и сяк (без бд). Накопи опыт.
Форум не заменит документацию.
class Locatiobn extends Model
{
public $table = 'v_locations';
. . .
Если единственный вариант прочитать гео-информацию в удобном виде это вызов функции БД, то наверное тебе помогут представления (view) на уровне базы. Подключай вью с уже преобразованными данными вместо таблицы. И не будет никакой разницы через связь ты добираешься до поля, или без неё.
CREATE VIEW v_locations AS SELECT ST_AsGeoJSON(geometry) as geometry ... FROM locations
А кроме координат со связанными данными всё окей? Что насчет чтения locations напрямую без реляции с shops?
Из текста не очевидно в чем именно проблема - настроена ли связь таблиц, добавляли ли casts.
1. Не так у тебя с именами. Ты зачем-то избегаешь общепринятого термина parent_id, у тебя это menu_id. Как следствие, странный нейминг переполз в название методов. И стало ничерта непонятно где что.
2. Ты не обозначил желаемый формат данных на выходе. В идеале надо показать пример исходных данных - в таблице. И как должен выглядеть результат - например в формате выдачи var_export()
Сделай заготовку с данными на https://www.db-fiddle.com/ пожалуйста. Ты упростишь работу тем, кто захочет помочь. Не заставляй нас тратить слишком много времени.
Во-первых, стандартный SQL не приспособлен для запросов типа "далее есть записи с...". Но можно переосмыслить задачу и добиться нужного результата.
Например так: выбрать всех пользователей, у которых не встречалось значение true (через группировку по пользователю). Для таких пользователей вывести все их записи.
Это можно реализовать через джойн или через where in подзапрос. В любом случае, начинать лучше с сочинения запроса на настоящем SQL, проверить его на правдоподобных данных и только потом выразить в виде Eloquent Query Builder.
удали /etc/php81w/php.d/40-psr.ini
Если решать на уровне базы, то понадобится формула для вычисления возраста и связь таблиц через неравенство, например через выражение BETWEEN. Важно чтобы значения в определении возрастной категории не пересекались и не содержали "дыр".
Нашел такие формулы для возраста на текущий момент:
DATE_FORMAT(FROM_DAYS(DATEDIFF(NOW(), users.dob)), '%Y')+0
или
TIMESTAMPDIFF(YEAR, dob, NOW())
А запрос в целом получился такой:
SELECT u.id, u.user_name, u.age, ages.age_title
FROM (
SELECT users.*, timestampdiff(YEAR, users.dob, now()) AS age
FROM users
) AS u
LEFT JOIN ages ON u.age BETWEEN ages.age_from AND ages.age_to
left join здесь на случай если у нас не описана какая-то возрастная категория, но мы не хотим терять в выводе пользователя.