Ответы пользователя по тегу Laravel
  • Как правильно организовать архитектуру таблиц для Eloquent?

    @jazzus
    Таблица contents не нужна. Связь с videos через ManyToMany таблица post_video. C остальными также, только непонятно почему article нельзя убрать в post и что такое tests
    Ответ написан
    Комментировать
  • Как фильтровать записи используя Eloquent?

    @jazzus
    $user->cars()
         ->whereNotNull('title')
         ->has('models')
         ->get();

    Только непонятно, как cars могут не иметь models и как title может быть null
    Ответ написан
  • Как можно скрыть блок в Laravel?

    @jazzus
    @if ($events->isNotEmpty())
     div
    @endif
    Ответ написан
    Комментировать
  • Как сделать универсальную Policy Laravel?

    @jazzus
    C помощью Gate. Прописать нужное правило в AuthServiceProvider и вызывать через Gate::allows. Но я бы так не делал. Т.к. скорее всего политики понадобятся и смысла дублировать проверки нет. Или логика для определенных моделей поменяется и придется переписывать все проверки вместо исправления одной политики. Ну и проверки политик по-интереснее выглядят. Поэтому лучше политики, без UniversalPolicy разумеется, а как в Ларавел написано - отдельно для каждой модели. Ибо в этом их смысл впринципе. А исходную инфу убрать в конфиги (цифры или что там у тебя). Можно и код проверки убрать в свой класс и вызывать в политиках, но это если там не $user->posts()->count() < config('post.limit') т.к. это не дублирование кода
    Ответ написан
    Комментировать
  • Laravel ui:auth - как вернуть json?

    @jazzus
    С помощью json методов
    $this->postJson(route('register'), $data)
         ->assertCreated();
    Ответ написан
    Комментировать
  • Как составить правильно отношение?

    @jazzus
    Тогда так
    $users = User::doesntHave('phones')
                 ->where('money', '>=', 100)
                 ->get();
    
    // в User
    public function phones()
    {
       return $this->hasMany('App\Models\Phone');
    }
    Ответ написан
    3 комментария
  • Как подгрузить комментарии в Laravel ajax?

    @jazzus
    return CommentResource::collection($comments);
    total в комплекте, взято отсюда
    Ответ написан
  • Ошибка с Route::resource() в Laravel?

    @jazzus
    В ресурсные маршруты не нужно передавать названия параметров.
    route('posts.show', $post)
    Т.е. либо ресурс либо его идентификатор если ресурса нет. Ларавел автоматом свяжет и в контроллере уже будет нужный ресурс
    public function show(Post $post)
    {
      dd($post);
    }

    Если key не id, а например slug то определить в модели так
    protected $primaryKey = 'slug';
    В бд не нужно давать префиксы для полей типа $post->post_id. Правильно делать $post->id, name, active и т.д. т.к. post всегда и так будет перед ними в названии переменной.
    И ресурсы нужно называть не post, а posts в роутах
    Route::resource('posts', 'PostController');
    Ответ написан
  • Как реализовать голосование на laravel?

    @jazzus
    Голосования, лайки, комментарии лучше делать через полиморфные связи, чтобы не плодить одинаковые таблицы и код. Т.к. сегодня голосуют за пост, завтра за фото, захочется перенести в полфиморфные, т.к. с ними в 100 раз проще, но уже будет геморойно исправлять. Я бы сразу делал полиморфные, убрал вместе сопутствующими проверками и экшен методами в трейт, который уже можно подключать к постам, фото-видео и любым другим моделям.
    Ответ написан
  • Как защитить get маршруты?

    @jazzus
    Если закрыть сам переход юзера по маршруту и просмотр json то сделать middleware isAjax c проверкой
    if (!$request->ajax()) {
     abort(404);
    }
    return $next($request);

    При попытке зайти отдаст 404. Но это не "защита" т.к. содержимое в network всегда есть в полном составе. Лучшая защита это отдавать только те данные, которые юзер видит на странице и не больше. Т.е. использовать API Resources, protected $hidden в моделях и точно составлять json ответ
    Ответ написан
    Комментировать
  • Добрый день, как писать на новом фреймворке корректно?

    @jazzus
    Писать корректно так. Возникла задача сделать роут. Открываешь раздел по роутам, используешь решения. Нужно сделать вьюху, открываешь раздел вьюх. Нужна таблица- миграции. И т.д. Если не понятно - гуглить, смотреть видео, спрашивать на Тостере. Любые желания написать свое простое и гениальное решение пресекать накорню. Смысла в этом нет т.к. в Ларавел все основные моменты и потребности предусмотрели. Чтобы ты сел и никуда не дергаясь написал проект. Если писать велосипеды, то потом воникнет навязчивое желание эти все велосипеды переписать, т.к. там 100% будут страницы неповоротливого говнокода с запутанными названиями и логикой, а это все поддерживать и менять тяжело. Тем более когда есть отлаженные решения с минимальным кодом на которые приятно смотреть и использовать, которые быстро тестируются и рефакторятся. То что ты хочшь учиться на велосипедах это ошибка. Там обучаешься только ленивому и неэффективному способу работы. Плюс можешь привыкнуть например открывать тег php во вьюхе и херачить запрос в бд. Я все свои такие велосипеды потом переписывал и это время можно было потратить на что-то полезное и интересное, поэтмоу не советую.
    Ответ написан
    Комментировать
  • Правильно ли добавлять свойство в объект модели таким образом?

    @jazzus
    А почему с with нельзя? Там же parent with children все стыкуется. Если правильно понял задачу то можно так
    Category::parents()
            ->with('children')
            ->get();
    
    // в Category
    public function children()
    {
      return $this->hasMany(self::class, 'parent_id');
    }
    
    public function scopeParents($query)
    {
        return $query->whereNull('parent_id');
    }
    Ответ написан
  • Зачем нужен namespace в группе роутов?

    @jazzus
    Помните, по умолчанию RouteServiceProvider включает ваши файлы роутов в группу пространства имён, позволяя вам регистрировать роуты контроллера без указания полного префикса пространства имён App\Http\Controllers.

    Route::namespace('Backend\Docflow\Document')
         ->name('document.')
         ->prefix('document')
         ->group(function () {
      Route::get('edit/{document}', 'DocumentController@edit')->name('edit');
    });
    Ответ написан
    Комментировать
  • Какие проекты на Laravel с открытым исходным кодом имеют правильную архитектуру?

    @jazzus
    Код должен быть такой, чтобы открыл файл и понял логику. Без документаций и комментариев. Такое у меня получается делать только с большим количеством файлов. Т.е. по-максимуму задействовать функционал Лары (там уже куча своих классов) – это в первую очередь. Остальное в своих классах. Основные простыни у меня в моделях т.к. все запросы через scope(чтобы быстро компоновать новые запросы из скоупов-частей). Решаю использованием трейтов – убираю туда скопы по темам, чтобы быстро получить доступ к группе связанных запросов и быстро их править или составить новый. Некоторые такие трейты использую в разных моделях. Например скоупы ofActive/ofApproved можно дофига где использовать. Также делаю репозитории и сервисы. Не потому что надо, а потому что мне так удобней. Т.е. книг совершенная архитектура не читал, пару раз загуглил, но там люди не особо убедительно объясняют (либо я не догоняю), поэтому делаю как нравится мне. Цель -простота и наглядность логики. Чтобы запускалась не страница кода, а класс. Все изолировано и с проверкой аргументов. И есть возможность быстро поменять логику (по методу кирпичиков). Сервис классы - логика, проверить, запустить, исполнить итд. Репозитории чтобы сформировать массив данных для фронта. Коллекции, наборы роутов, текстов и т.д. Обычно создаю базовую репу от которой наследуются остальные, т.к. много общих данных. Минимум абстракций и автоматизаций, конкретные понятные прямые действия с минимумом if. Короче много файлов, в каждом минимум кода, все поделено. Но это мой непрофессиональный опыт т.к. профильные вузы не заканчивал, в гугле не работал, занимаюсь своими проектами и ответом нужно пользоваться с осторожностью.
    Ответ написан
  • Как решить ошибку миграции Laravel?

    @jazzus
    это что с версии выше 5,8 он не работает?

    Примерно с этой версии Laravel стал генерить миграции с bigIncrements ids тогда у многих посыпалось (кто не читал описание апгрейда, конечно)) как правильно ответил Алексей пропиши в blogs

    $table->bigInteger('user_id')->unsigned();

    на Laravel 6

    Начинать лучше с 7й т.к. по сравнению с 6й есть моменты где можно потом нарваться на рефаукторинг)
    Ответ написан
    1 комментарий
  • Как организовать хранение и обработку информации о файлах на Laravel?

    @jazzus
    Для картинок сделать отдельный Seeder генерить там только картинки через отношение с файлом . Для файлов без картинок свой
    Ответ написан
    Комментировать
  • Как с помощью Carbon вывести все посты которые были опубликованы до определенной даты?

    @jazzus
    $builder->whereDate('created_at','<', now()->sub(1,'day'))
    Ответ написан
    Комментировать
  • Как получить количество сущностей относящихся к связям?

    @jazzus
    $users = User::with(['categories' => function ($query) {
             $query->withCount(['posts' => function ($q) {
              $q->whereColumn('posts.user_id', 'user_categories.user_id');
              }]);
           }])->get();
    Ответ написан
  • Как оптимизировать вывод всех элементов на странице?

    @jazzus
    $category = Category::whereSlug($slug)
                        ->firstOrFail();
                        
    $translations = $category->translations()
                             ->with('team')
                             ->paginate(15);
                             
    return view('translation.index', compact('category', 'translations'));
    Ответ написан
    3 комментария
  • Есть ли аналог scope для коллекций Laravel?

    @jazzus
    Бояться запросов не стоит бд для того и создана) Если данных много запрос будет быстрее чем фильтровать коллекцию (проверено). Вообще лучше думать так – нет скопов, значит их не должно быть. С различного рода новаторскими идеями без опыта можно потом нарваться на нехилый рефакторинг (проверено). Я бы сделал так
    // В модели Post
    public function activeComments()
    {
      return $this->commnets()->ofActive();
    }
    
    public function inactiveComments()
    {
      return $this->commnets()->ofInactive();
    }
    
    // в контроллере/классе
    $relations = ['activeComments', 'inactiveComments'];
    
    Post::with($relations)
        ->withCount($relations)
        ->get();

    Скопы убрать в трейт, чтобы подключать к разным моделям с активностью
    Ответ написан
    Комментировать