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

    @jazzus
    OrderResource
    public function toArray($request)
    {
        return [
          'id' => $this->id,
          'status' => $this->status,
          'client_email' => $this->client_email,
          'partner' => new PartnerResource($this->partner)
        ];
    }

    PartnerResource
    public function toArray($request)
    {
        return [
          'id' => $this->id,
          'name' => $this->name,
        ];
    }

    скинуть кеш браузера, проверить что данные есть в ордерс+партнер до ресурса
    Ответ написан
    Комментировать
  • Как обратиться к таблице ролей?

    @jazzus
    В модели user
    //  отношение
    public function roles()
    {
      return $this->belongsToMany('App\Models\Role', 'user_role');
    }
    // проверка
    public function hasRole($id)
    {
      return $this->roles()
                  ->where('roles.id', $id)
                  ->exists();
    }
    // для наглядности
    public function isAdmin()
    {
      return $this->hasRole(Role::ID__ADMIN);
    }

    В модели Role
    // 1 это ид роли
    const ID__ADMIN = 1;

    Проверять так
    if ($user->isAdmin()) {
          // code...
    }

    Но так проверять не надо. Т.к. придется Auth::check() чекать и условия прав доступа могут постоянно меняться. И по всему приложению нужно будет переписывать. Поэтому лучше сразу повникать в политики и пермишины для ролей.
    Ответ написан
    Комментировать
  • Как сократить текст поста на главной странице?

    @jazzus
    Прописать в модели Post
    public function getShortContentAttribute()
    {
        return Str::limit($this->content, 20, ' (...)');
    }

    получать в шаблоне
    $post->ShortContent;
    Ответ написан
    Комментировать
  • Как избавиться от ошибки Missing required parameters for [Route: password.reset] [URI: {locale}/password/reset/{token}]?

    @jazzus
    Т.к. ко всем auth роутам добавляется новая переменная locale ее нужно передавать во всех роутах первым аргументом, иначе будут ошибки. В этом случае в нотификации ResetPassword в строке
    ->action(Lang::get('Reset Password'), url(config('app.url').route('password.reset', ['en', 'token' => $this->token, 'email' => $notifiable->getEmailForPasswordReset()], false)))

    В вендоре менять ничего нельзя. Нужны свои файлы и методы, как это делать в гугле куча материала.
    Нужно пройтись по всем роутам, искать по name роута (например здесь 'password.reset') и добавить локаль первым аргументом.
    Ответ написан
    3 комментария
  • Как сделать валидацию на уникальность плюс ещё несколько условий?

    @jazzus
    Можно так
    Rule::unique('users')->where(function ($query) {
        return $query->whereNull('field');
    })
    Ответ написан
    Комментировать
  • Laravel фильтр по нескольким параметрам?

    @jazzus
    У юзера гендер заполнен? dd($gender) что отдает? Зачем request в скопе? Или это обрезанный код? Для дебага здесь нужно точный постить. Почему не через отношения сделано? Я бы все указанные поля из атрибутов в users запихал и можно вообще без таблицы атрибутов
    User::where('gender', $gender)
    Ну или whereHas юзать если через отношения, но гендер точно нужно не в атрибутах хранить. FullName можно в модели собрать
    public function getFullNameAttribute()
    {
        return $this->name.' '.$this->lastname;
    }

    и получать через
    $user->FullName
    Ответ написан
    Комментировать
  • Как использовать resource для разных ролей пользователей?

    @jazzus
    С помощью политик
    Ответ написан
    Комментировать
  • Как вывести компании по количеству комментариев?

    @jazzus
    Company::has('comments', '>', 1)
    Ответ написан
    Комментировать
  • Laravel 6 Как правильно сделать валидацию svg?

    @jazzus
    Зачем svg начинаться с какого-то там тега? Пускай начинается как должен. У меня была похожая ситуация, когда не пропускал docx с миме docx и проблема была в самопальном редакторе, с помощью которого файл был создан. Для проверки по расширению сделать Rule с проверкой
    public function passes($attribute, $value)
    {
      // проверка на совпадение расширения файла с svg
      return $value->getClientOriginalExtension() === File::EXTENSION__SVG;
    }
    Ответ написан
    Комментировать
  • Как лучше реализовать такое ограничение?

    @jazzus
    Тебе нужны политики для модели article сделать политику прописать доступ и ограничивать с помощью can в шаблонах. В доках подробные примеры для разных ситуаций. Либо просто сделать проверку от юзера. Я так понимаю у тебя ролей нет и ты просто сделал поле admin в users. Тогда в модели User сделать проверку типа
    public function isAdmin()
    {
      return $this->admin === 1;
    }

    и в шаблонах
    @if (Auth::user()->isAdmin())
      показать кнопку
    @endif

    но лучше политиками т.к. наглядней и проще рефакторить. Даже с одной ролью. Например захочешь создание статей еще в конфигах отключать. С политиками ты в методе create в ArticlePolicy добавляешь этот конфиг и у тебя по всему приложению заработала логика и не нужно везде дублировать код если что-то меняется. Советую потратить время на вникание, чем потом писать свои велосипеды. Иначе смысл Ларавел использовать?
    Ответ написан
    Комментировать
  • Чем laravel от бутстрапа отличается?

    @jazzus
    Laravel это мозг, сердце, печень, почки. Ты их не видишь, но они есть (почти всегда). Бутстрап – лицо, кожа, волосы. Ты их видишь, но смысла в них без сердца немного. Потому что они связаны. Как печень работает, так и кожа-рожа выглядит. Как мозг работает так и человек себя ведет. Так же и с сайтом. Например, форма авторизации вк. Ты ее видишь. Кнопочки, цвета, формы. Это типа Bootstrap. Когда ты вводишь свои данные и нажимаешь кнопку отправить они улетают в Ларавел на сервер. Он эти данные получает и начинает проверять. Если то, если это, какой телефон, телефон ли и т.д. Это программист написал логику в Ларавеле на php. Ты эту логику не знаешь и не видишь, но она командует парадом, Bootstrap и всеми действиями юзера на сайте.
    Ответ написан
    1 комментарий
  • Нужны ли модели для смежных таблиц?

    @jazzus
    Например, тебе зачем-то понадобилось вывести на странице все pivot записи из user_roles и вместо user_id отобразить имя юзера. Создаешь модель UserRole, прописываешь belongsTo User, делаешь запрос UserRole with user и показываешь в шаблоне $pivot->user->FullName фигачишь какой-нибудь поиск с сортировкой и фильтрацией по pivot записям, делаешь ссылки на юзера выводишь role name, статистику - все это наглядно с простым кодом и только нужными запросами. В общем делать тогда, когда в pivot модели будет необходимость, как в самостоятельной логической сущности, когда ты от нее отталкиваешься а не к ней приходишь, когда тебя не юзеры/роли интересуют,а pivot данные со своими отношениями/методами.
    Ответ написан
    Комментировать
  • Как выбрать последнюю запись в каждой группе в Laravel?

    @jazzus
    Сделать hasOne отношение в модели Chat
    public function lastMessage()
    {
      return $this->hasOne('App\Models\Message','chat_id', 'id')->latest();
    }

    В контроллере
    $chats = Chat::with('lastMessage')->get();
    в шаблоне
    @foreach ($chats as $chat)
      {{ $chat->lastMessage->name }}
    @endforeach
    Ответ написан
    Комментировать
  • Как реализовать такую архитектуру на Eloquent laravel?

    @jazzus
    Я за 4. Связь hasOne и поле user_id в каждой таблице. При регистрации юзер выбирает, что он врач и ты создаешь запись в doctor_profile. Подтягивать через with. Удобно тем что просто и наглядно)
    Ответ написан
    Комментировать
  • Как безболезненно менять весь контент письма MailMessage в laravel?

    @jazzus
    Команда
    php artisan vendor:publish --tag=laravel-mail
    копирует email сюда
    resources/views/vendor/mail
    и можно менять как хочешь
    Ответ написан
    Комментировать
  • Отдельная папка в Controllers для каждой роли?

    @jazzus
    Дублировать код ненормально. Попытка провести рефакторинг дублирующего кода, когда идеи могут меняться на ходу, а исправлять в 10 файлах - вас в этом убедит. По поводу проверки доступа в Laravel уже давно все придумано. Добавить к этому связи между таблицами roles, perms и users (многие ко многим), добавить в таблицу роли и разрешения и можно использовать без модулей. И даже здесь проверки делать не по ролям, а по доступу (таблица perms) т.к. доступы у ролей могут пересекаться. Готовых описаний как точно сделать в Интернете полно. Там элементарно. Можно еще добавить булеан поле active к user_role, чтобы можно было быстро деактивировать роль пользователя (у пользователя может быть несколько ролей) с сохранением истории для мгновенного восстановления. Это можно юзать при модерации юзеров с минимумом кода и без ведения логов (получаешь inactive roles пользователя и делаешь active true)
    Ответ написан
    Комментировать
  • Laravel отображение по подпискам?

    @jazzus
    Почему с одним тегом? Чтобы тег спам не модерировать?) Лучше сделать изначально сколько угодно тегов и ограничивать настройками приложения, чтобы не рефакторить потом структуру бд. По теме. Нужно юзеров связать с тегами, а теги с постами через manyToMany типа
    public function tags()
    {
      return $this->belongsToMany('как в доках');
    }

    и запрашивать
    $user = User::with('tags.posts')
                ->find(Auth::id());

    будет юзер с коллекцией тегов, а у каждого тега коллекция постов. в шаблоне можно форычить так
    @foreach ($user->tags as $tag)
      @foreach ($tag->posts as $post)
        {{ $post->name }}
      @endforeach
    @endforeach

    Как получить посты тегов юзера сразу. В Tag делаем скоп
    public function scopeOfUser($query, $userId)
    {
       return $query->whereHas('users', function($query) use($userId) {
                    $query->where('user_tag.user_id',$userId);
              });
    }

    И сам запрос
    $posts = Post::with('tags')
                 ->whereHas('tags', function($query) use($userId) {
                       $query->ofUser($userId);
                   })->get();

    Или сделать полиморфные отношения, я сними не работал, но возможно здесь подойдут.
    Ответ написан
    2 комментария
  • Как задать имя сайта в функции helper route?

    @jazzus
    Name нужен для роутов где может измениться урл. Для / не актуально. В контроллерах можно отправлять
    return redirect('/');
    урл главной можно получать через
    url('/')
    или прописать в env/app конфиге, чтобы получать
    config('app.url')
    Ответ написан
    Комментировать
  • Как правильно записывается массив в контроллер Laravel?

    @jazzus
    В контроллере
    $users = [
         [
          "name" => "Вася",
          "age" => 33,
          "salary" => 450
         ]
     ];
    return view('users', ['users' => $users]);
    // или
    return view('users', compact('users'));

    в шаблоне users
    @foreach ($users as $user)
            {{$user['name']}}
    @endforeach
    Ответ написан
    Комментировать