Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 Re: Laravel 6/7/8/9/10 » Количество объектов/материалов на первой странице листинга » 17.05.2023 11:34:16

...->paginate($perPage)

когда этот необязательный параметр пропущен, то внутри метода paginate() вычисяется как

$perPage = $perPage ?: $this->model->getPerPage();

...

public function getPerPage()
{
    return $this->perPage;
}

то есть можнро задать значение по умолчанию для конкретной модели.

P.S. Используй хорошую IDE и смотри её подсказки, прыгай в определение методов!

#2 Re: Laravel 6/7/8/9/10 » Кэш Статус Онлайн и офлайн. Ларавель 7 » 30.03.2023 09:54:22

@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 wink

— This is the way. May the force be with you.

#3 Re: Laravel 6/7/8/9/10 » Кэш Статус Онлайн и офлайн. Ларавель 7 » 30.03.2023 09:36:01

"Last seen" читается как "Последний раз видели". Сохраняй просто now(). Время последнего визита пользователя не зависит от величины таймаута для вычисления кто онлайн. Логика!!!

А в контроллере вычисляй время назад, то есть отнимай от текущего. Типа
User::where('last_seen', '>', now()->subMinutes(ONLINE_TIMEOUT))->count()

Еще раз: кеш здесь не нужен. Кеш кроме того что необязателен, еще не имеет смысла там, где постоянно происходит обновление. Он оптимизирует ситуацию когда редко пишется и часто читается. И при отсутствии нужных данных в кеше приложение должно выдавать те же результаты! (только может быть немного медленнее) Если у тебя не так, то это логическая ошибка.

#4 Re: Laravel 6/7/8/9/10 » Кэш Статус Онлайн и офлайн. Ларавель 7 » 28.03.2023 11:03:26

Кеш по определению нечто необязательное, может отсутствовать в любой момент. Поэтому применять его таким образом нелогично.

Статус онлайн пользователя определяют через сохранение отметки о его последнем визите. Например в самой таблице пользователей или в специальной таблице. И считаем что пользователь онлайн если он был здесь не более 10 минут назад, к примеру.

#5 Re: Lumen » Как авторизоваться с помощью api_token? » 28.03.2023 10:47:58

Код, который ты цитируешь, "в котором берётся api_token" smile на самом деле служит для аутентификации по токену. То есть когда правильный токен присутствует в запросе, то в программе будет доступен "текущий пользователь". Вот что там происходит!

Надо полагать, теперь тебе в контроллере надо читать этого юзера, возможно проверять его права доступа и принимать решение давать или не давать. Сам токен тебе уже больше нигде не нужен.

Как мне им воспользоваться в контролёре app/Http/Controllers/AuthorController.php ?

как в документации написано:

$user = Auth::user();
или
$user = $request->user();

#6 Re: Lumen » Как авторизоваться с помощью api_token? » 28.03.2023 10:41:07

Мне нужно посмотреть пришёл ли вместе с post или get запросом APP_KEY и в зависимости от этого продолжить выполнение метода или вернут 403 ошибку если APP_KEY не пришёл.

API_KEY не так работает. Ты путаешь ключ и токен. Ключ используется скриптами для шифрования или подписывания какой-то информации. Используется для создания токенов доступа. Буквально сам ключ не передается никуда!

Советую делать по инструкции из официальной документации. Разделы Authentication, Authorization

#7 Re: Laravel 6/7/8/9/10 » Надо узнать количество записей » 15.02.2023 07:16:51

Нет, про копирование id в path речи не было. Но ты можешь попробовать это.
Уже пора пробовать, @kull88, давай дальше сам.

#8 Re: Laravel 6/7/8/9/10 » Надо узнать количество записей » 14.02.2023 12:58:03

Например если хранить путь как это принято в 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.%'

#9 Re: Laravel 6/7/8/9/10 » Надо узнать количество записей » 14.02.2023 12:33:41

Это называется дерево ))) А отношения между пользователями такие обычно при участии в реферальной программе. Но ничего этого не прозвучало )))

Есть несколько эффективных методов хранения древовидных структур - Nested Sets, Materialized (или Storing) Paths, Closure Tables... они позволяют в один запрос к базе получить количество дочерних узлов или добыть сами узлы.
А для id - parent_id (т.н. Adjacency List), такое невозможно. Теперь ты знаешь какие слова гуглить.
Не за что!

#10 Re: Laravel 5.x » Не видит подключаемые link (css,js) на 127.0.0.1:8000 » 01.02.2023 16:19:07

DirectoryIndex public/index.php
и
RewriteRule ^(.*)$ public/index.php [L]

как бы намекают что у тебя сайт (был) настроен не на месте. или на месте но не настроен ))) потому что корень сайта уже должен быть в папке public и значит слова public уже не должно появляться в .htaccess

если ты что-то решил у себя, то поделись с другими. не веди себя как будто тебе здесь должны, а ты ничего не должен. мы все в одном положении!

#11 Re: Laravel 6/7/8/9/10 » Надо узнать количество записей » 29.01.2023 14:18:56

Друг, чтобы программировать надо научиться вопросы задавать внятно. Я несколько раз перечитывал и не понял в чем затруднение. Вот это просто шедевр:

где id=3 потом взять id где равен 3 и пройти дальше.

куда тебе надо пойти?

Общее количество записей добывается если убрать условие where(), оставить только count()

#12 Re: Laravel 6/7/8/9/10 » Отношения моделей вместо построителя запросов » 29.01.2023 14:06:59

Через отношения или чтобы имена не светились? Это разные задачи.

Если буквально хочешь использовать отношения, то смотри в доках методы with, withCount. Это не равноценно join, т.е. будет другой запрос, но цель возможно будет достигнута.

Если надо взять имя таблицы из определения класса-модели, то сам Тейлор совтует делать так: with(new Model)->getTable();

#14 Re: Хорошие практики (FAQ) » Регистрация пользователя, User::create() нет такого метода » 29.01.2023 13:51:00

Странно что нет метода create. Покажи свой класс User. И скопируй сюда об ошибке как оно есть буквально.
[offtopic]
не налегай сильно на видеоуроки. они приучают отключать голову и просто копировать текст. чтобы росли скиллы в программировании, надо себя напрягать - как с мышцами.
[/offtopic]

#15 Re: Laravel 6/7/8/9/10 » VS code не видит namespace. Запуск фреймворка » 07.01.2023 19:08:02

@loren, про расширения vs не знаю, так как не пользуюсь. А про открытие artisan через open server - он и не должен работать в веб-сервере как php! Потому что у него нет расширения. Странно что ты вообще имеешь к нему доступ через веб-сервер, ведь он должен быть за пределами Document Root. Надо настроить сайт так, чтобы он начинался с папки public, а не с корня проекта.

#16 Re: Laravel 6/7/8/9/10 » Вызов метода контроллера непосредственно в шаблоне Laravel » 19.12.2022 10:16:43

Сейчас все это берется из БД. Соответственно, в каждом таком инклуде я вызываю метод контроллера для получения нужных данных.

Вот это неожиданный переход. Почему именно метод контроллера? ))) По классике данные доставляются в представление через параметры вызова view. Если этого мало - есть View Composer. А если прям сильно хочется обращаться к чьим-то методам, то в шаблоне можно добывать некий сервис через @inject и обращаться к его методам.

Я бы таки ограничился параметрами вьюхи. Из главного представления в инклуды передавал бы нужные им параметры.
Есть еще компоненты это типа "умные инклуды".

#17 Re: Laravel 6/7/8/9/10 » Подскажите, как в route подставить данные из бд? » 07.12.2022 21:40:48

Будь я админ, я б тебя забанил за ссылки в первом же посте. )))

В программировании самое важное это умение внятно сформулировать цель. Без этого будет просто трата времени и сил. Весь твой пост это пример невнятности.

Роутом (маршрутом) обычно называют соответствие URL и обработчика. То что описано в routes/web.php. А не функция route().

Такие варианты не срабатывают

Потому что не должны. Не надо стрелять вслепую. Надо осмысленно писать код, зная синтаксис.

Если у тебя проблема с подстановкой значений в строку, то бд здесь скорее всего не при чем. Почитай документацию про строки в PHP. Про шаблоны в Laravel. Попробуй так и сяк (без бд). Накопи опыт.

Форум не заменит документацию.

#19 Re: Laravel 6/7/8/9/10 » Преобразование поля Eloquent » 27.11.2022 11:48:31

Если единственный вариант прочитать гео-информацию в удобном виде это вызов функции БД, то наверное тебе помогут представления (view) на уровне базы. Подключай вью с уже преобразованными данными вместо таблицы. И не будет никакой разницы через связь ты добираешься до поля, или без неё.

CREATE VIEW v_locations AS SELECT ST_AsGeoJSON(geometry) as geometry ... FROM locations

#20 Re: Laravel 6/7/8/9/10 » Преобразование поля Eloquent » 23.11.2022 16:30:25

А кроме координат со связанными данными всё окей? Что насчет чтения locations напрямую без реляции с shops?

Из текста не очевидно в чем именно проблема - настроена ли связь таблиц, добавляли ли casts.

#21 Re: Laravel 6/7/8/9/10 » Проблемма с вложенностью » 27.10.2022 20:57:19

1. Не так у тебя с именами. Ты зачем-то избегаешь общепринятого термина parent_id, у тебя это menu_id. Как следствие, странный нейминг переполз в название методов. И стало ничерта непонятно где что.
2. Ты не обозначил желаемый формат данных на выходе. В идеале надо показать пример исходных данных -  в таблице. И как должен выглядеть результат - например в формате выдачи var_export()

#22 Re: Хорошие практики (FAQ) » Возможно ли в один запрос...? » 27.10.2022 20:49:48

Сделай заготовку с данными на https://www.db-fiddle.com/ пожалуйста. Ты упростишь работу тем, кто захочет помочь. Не заставляй нас тратить слишком много времени.

#23 Re: Хорошие практики (FAQ) » Возможно ли в один запрос...? » 27.10.2022 20:47:40

Во-первых, стандартный SQL не приспособлен для запросов типа "далее есть записи с...". Но можно переосмыслить задачу и добиться нужного результата.

Например так: выбрать всех пользователей, у которых не встречалось значение true (через группировку по пользователю). Для таких пользователей вывести все их записи.

Это можно реализовать через джойн или через where in подзапрос. В любом случае, начинать лучше с сочинения запроса на настоящем SQL, проверить его на правдоподобных данных и только потом выразить в виде Eloquent Query Builder.

#25 Re: Laravel 6/7/8/9/10 » Помогите найти решение с определением возрастной категории человека » 22.08.2022 08:20:05

Если решать на уровне базы, то понадобится формула для вычисления возраста и связь таблиц через неравенство, например через выражение 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 здесь на случай если у нас не описана какая-то возрастная категория, но мы не хотим терять в выводе пользователя.

https://www.db-fiddle.com/f/tXjJazKZT7wqjyqr4MoNx8/0

Подвал раздела