Ответы пользователя по тегу Laravel
  • Как сделать выборку юзеров через модель, кроме юзеров с определенными емейлами (вроде черного списка)?

    @jazzus
    Добавляем в модель User отношение на таблицу черного списка
    public function blackEmail()
    {
        return $this->hasOne('App\Models\BlackEmail', 'email', 'email');
    }

    И юзаем везде
    User::doesntHave('blackEmail')
        ->get();

    или в таблицу users добавить boolean поле has_black_email
    User::where('has_black_email', false)
        ->get();
    Ответ написан
    Комментировать
  • Для Notification в ларавель есть метод, подобный методу bcc для Mail::to?

    @jazzus
    $admin->notify(new Message());
    следом за юзером или в классе нотификации добавить к MailMessage
    public function toMail($notifiable)
    {
        return (new MailMessage)
            ->cc('admin@example.com')
            ->markdown('mail');
    }

    https://laravel.com/docs/8.x/notifications#mail-no...
    Ответ написан
    2 комментария
  • Почему возникает ошибка Call to undefined method Illuminate\Database\Eloquent\Relations\BelongsTo::stores()?

    @jazzus
    Так никто не вызывает отношения. С этим методом getStoresOfParentBranch может возникнуть куча проблем. От тысяч одинаковых запросов к бд до ошибок.

    Правильно делать так.

    Если отношение вызывается один раз, то пишем сразу в контроллере/шаблоне.

    $store->branch->stores;

    Но НЕ в модели.

    Если планируются циклы или коллекции json ресурсов, или просто >1 вызовов отношения то вначале цепляем через with

    Store::with('branch.stores')
        ->get();

    и потом уже юзать $store->branch->stores без запросов к бд, сколько бы элементов в коллекции не было. Хотя я бы по другому сделал. Но грузить не буду. Для начала хватит от getStoresOfParentBranch избавиться пока не поздно.
    Ответ написан
    4 комментария
  • Как сделать поиск Laravel?

    @jazzus
    $cityId = $request->input('city_id');
    $categoryId = $request->input('category_id');
    
    $adverts = Advert::when($cityId, function ($query, $cityId) {
        $query->where('city_id', $cityId);
    })
        ->when($categoryId, function ($query, $categoryId) {
            $query->where('category_id', $categoryId);
        })
        ->get();
    Ответ написан
    Комментировать
  • Какая разница между связями belongsTo и hasOne?

    @jazzus
    Разницу подскажет Ларавел если не прописывать ключевики. Можно прописать неверные ключевики в hasOne/belongsTo отношениях и будет все работать. Но отношения будут составлены неверно.

    Есть 2 отличия.

    Техническое

    При user hasOne/hasMany phones Ларавел ожидает, что this id модели (User) будет равен user_id в Phone
    При phone belongsTo user Ларавел ожидает что this user_id модели (Phone) будет равен id модели в User

    Главный здесь юзер т.к. его ид есть в модели Phone, а phone_id в модели User нет. Поэтому User hasOne Phone, а Phone belongsTo User.

    Логическое

    Правильно: Юзер имеет один телефон. Юзер имеет много телефонов. Телефон принадлежит юзеру.
    То что телефон имеет юзера это сейчас часто встречается, но логически неверно)

    Короче. В user прописываем hasOne phone/hasMany phones. В Phone belongsTo user.
    Ответ написан
    1 комментарий
  • Laravel как создать связь через несколько таблиц?

    @jazzus
    HasMany Through
    user hasMany warehouses through branches with prices
    получать через $user->warehouses прайсы внутри

    Или через вложенные отношения в филиалах
    $user->branches()
        ->with('warehouses.prices')
        ->get();

    Здесь нужно будет форычить branches и в каждом будет $branch->warehouses и по цепочке.

    Или запросом на складах
    Warehouse::whereHas('branche', function ($query) {
        $query->where('user_id', Auth::id());
    })
    ->get();

    прайсы аналогично
    Ответ написан
    Комментировать
  • Где можно посмотреть практики написания хороших тестов для laravel?

    @jazzus
    В программировании можно какие угодно "бест практики" выдумывать в бесконечных вариациях. Я бы не смотрел на эти изобретения. В доках все понятно написано. Http тесты тестируют http запросы и больше ничего, список ассертов приведен и тд. Тесты не пишут для бест практик и "покрытия", их пишут, чтобы они тебе были нужны как разработчику, фиксировали нужный функционал и работали. А не тесты ради тестов. По структуре все просто - одинаковые объекты, конфиги и тд (как, например у него здесь везде дублируется primaryPost) - в setUp тест класса если во всех тестах или выносится в TestCase/трейты и дальше тесты. Каждый запускается с нуля, за редким исключением прописываются зависимости через @depends. И тесты нужно писать до разработки(тдд). Иначе это будет фигня, а не тесты. Или скорее всего не будут т.к. "покрывать" существующий функционал это очень утомительно и неинтересно. В отличие от тдд, с которым разработка легка и приятна.
    Ответ написан
    Комментировать
  • Как сделать запрос к базе данных?

    @jazzus
    whereHas
    Product::where('category_id', 5)
        ->whereHas('shops', function ($query) {
            $query ->whereHas('mapPoints', function ($query) {
               $query->where('city_id', 10);
            });
    })
    ->with(...)
    ->get();

    with аналогично, запрос можно вынести в scope см документацию.
    Ответ написан
    2 комментария
  • Как сделать чтоб отключили товар и программа думала что страницы нет?

    @jazzus
    Global Scopes с ->where('active', true) решит проблему с такими товарами во всех запросах (каталог, поиски, 404 на show и тд) за 1 минуту) Будет что-то типа самопального soft delete. Единственное в запросах где нужны будут все товары (включая inactive) необходимо будет помнить о скопе и добавлять withoutGlobalScope.
    Ответ написан
    Комментировать
  • Каким способом можно реализовать настройки пользователя, зависящие от его роли?

    @jazzus
    Я беру из конфига/ дефолт атрибутов модели и тд. Но у меня программистские проекты) Т.е. в админке делать нечего. Если в проекте важно все делать из админки выбор очевиден. Т.е. ответ - ориентироваться на потребности проекта
    Ответ написан
    Комментировать
  • Отсортировать данные только за сегодняшний день Laravel 8 - как?

    @jazzus
    DB::table('sessions')
        ->select('last_activity')
        ->whereDate('last_activity', today())
        ->get();

    но если просто посчитать то коллекцию создавать не нужно (count на запросе)
    Ответ написан
    Комментировать
  • Как правильно выносить логику из моделей?

    @jazzus
    Есть ли способ код в модели раскидать по разным классам сгруппировав по общему смыслу но чтобы они были все одной моделью?

    Трейты.

    но разницы нет что Auth::user() что $this->getUser();

    разница есть. В первом случае я понимаю что получу авторизованного юзера. Во втором получу какого-то юзера непонятного. А если открою метод и увижу Auth::user() будет фейспалм)

    сыт репозиториями бесполезными

    Ну так это ООП. Пока проект простой смысла нет. Потом усложнится чутка и смысл появляется.
    Вообще вопрос абстрактный и без кода бесполезный. Т.к. что-то в моделях, что-то в сервисах, а дофига чего в других Ларавел классах, которые часто не используют.
    Ответ написан
    8 комментариев
  • В чем может быть причина поломки faker в Factory из под тестов?

    @jazzus
    в старой версии
    factory(User::class)->create();
    в новой
    User::factory()->create();
    Ответ написан
    Комментировать
  • Cкрыть сайт от всех пользователей, кроме поисковых роботов laravel?

    @jazzus
    Устанавливаем пакет jenssegers/agent

    Создаем мидлварь IsRobot c кодом
    if (!(new Agent)->isRobot()) {
        abort(404);
      }
    return $next($request);

    Добавляем мидлварь к файлу роутов в RouteServiceProvider
    Route::middleware('web', 'isRobot')
    ...
    Ответ написан
  • Почему expectException не работает в функциональных тестах?

    @jazzus
    В http тестах findorfail проверяется максимум assertNotFound. Это логично. Http запрос ничего про php код/Ларавел не знает и знать не должен. Если нужно тестировать код, тогда нужно писать юнит тесты.
    Ответ написан
  • Как в Laravel связать таблицу с последней записью другой по ключу?

    @jazzus
    public function latestRest()
    {
        return $this->hasOne(ProductRest::class)->latest();
    }
    Ответ написан
    Комментировать
  • Как правильно проводить функциональное тестирование Laravel?

    @jazzus
    Почему на зеленой кнопке сверху отсутствует буква Ы?) Потому что на Тостере задают ОДИН конкретный вопрос. А не 15. Напишу в общем. Я пишу тесты перед разработкой, поэтому вопрос выбора "покрытия" не стоит. Я рекомендую этот вариант. Да, ты пишешь больше кода, но время разработки в итоге меньше т.к. разработка это постоянный дебаг кода и логики, которые без тестов нужно делать руками. Плюс качество/безопасность кода и тестов гораздо выше, есть подробное продуманное тз (в тестах), документация и свободная голова. По структуре - прописываю вначале setUp где задаю нужные данные, создаю объекты и тд и затем тесты. Дубликаты кода в пределах класса выношу в методы. В пределах всех тестов - в TestCase или трейты. Каждый тест(сценарий) запускает логику с нуля, но иногда связываю через @depends.
    Ответ написан
    Комментировать
  • Обязательно ли нужен токен в ларавель?

    @jazzus
    Если у тебя настоящее апи (а не просто контроллеры в Api неймспейсе) то нужен токен. Т.е. там где нет сессий, проверки csrf и тд. Актуально для сайта с мобильным приложением, крупных проектов разделенных на сервисы и т.д.. Если просто сайт без понимания что происходит и зачем, то делаешь так и не паришься. Переделать всегда можно.
    Ответ написан
  • С какой версии лучше начинать изучать Laravel?

    @jazzus
    Основное отличие 7-ки от 8-ки это роуты (в 8 нужно использовать неймспейсы и по-другому вызывать методы контроллеров) и фабрики моделей (в 8 вызывается factory метод у модели). А учитывая, что фабрики не всем нужны то остаются только роуты, а там нужно открыть документацию и посмотреть новый синтаксис, когда ошибка возникнет. Т.е. смысла ставить 7 вообще нет.
    Ответ написан
    4 комментария
  • Laravel Livewire?

    @jazzus
    livewire нужно точно также изучать как и js
    livewire нисколько не упрощает работу с фронтом
    livewire внедряет в понятную архитектуру Ларавел свой костыльный вариант
    Простые вещи на js в livewire приходится прикручивать костылями
    тесты кривые и покрывают малую часть
    проблему на js ты взял и загуглил + туча всяких примеров, курсов, статей, модулей и решений, а livewire нормальные разработчики не используют, поэтому информации по нему 0
    Итог - если любишь костыли и геморой ставь livewire, если нужен ajax и нет навыков в js - vue быстро изучается, с хорошей документацией и кучей примеров в гугле.
    Ответ написан
    Комментировать