• Почему $note не выводится в файл?

    Lyrium
    @Lyrium
    Web developer
    а данные точно есть в этом элементе массива?
    попробуйте вот так заменить {$data['note']} в строке.
    Ответ написан
  • Как дебажить если display_errors не помогает?

    Lyrium
    @Lyrium
    Web developer
    как вариант завернуть проблемный блок кода
    try {
      // проблемный код
    } catch (\Throwable $exception) {
      \Illuminate\Support\Facades\Log::error($exception);
    
      return response()->json($exception);
    }


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

    Логи в Laravel проектах хранятся по такому пути project/storage/logs/.. и тут файлики логов.

    Также посмотреть в .env файле (находится в корне проекта) чтобы следующие параметры имели такие значения:
    APP_DEBUG=true
    LOG_CHANNEL=daily
    LOG_LEVEL=debug
    Ответ написан
    Комментировать
  • Как найти среднее арифметическое из значений массива на php?

    Lyrium
    @Lyrium
    Web developer
    $array = array_filter($array);  // если используете php7.4+ то array_filter($array, fn($item) => $item !== '');
    $average = array_sum($array) / count($array);
    echo $average;
    Ответ написан
    1 комментарий
  • С чего начать обучение PHP?

    Lyrium
    @Lyrium
    Web developer
    Для начала дочитай Котерова "PHP7 в подлиннике", без теории будешь как слепой котенок тыкаться во все неизвестное и шишок набьешь. В книге много полезных знаний.

    А практика - сделай страницу о себе с блогом и постами/комментами. Как все будет готово переделай, используя фреймворк, для начала возьми простой CodeIgniter, например. А затем на Symfony/Laravel напиши тоже самое. И может будет какой-нибудь толк. Главное сначала начни все делать самостоятельно, не используя готовые решения из фреймворков это даст тебе возможность разобраться в основах кухни веба, чтобы понимать "магию" .
    Ответ написан
  • Как работать то с Homestead?

    Lyrium
    @Lyrium
    Web developer
    Homestead это настроенный бокс Vagrant'a, обычно в связке с VirtualBox. Там свежая Ubuntu со всем необходимым софтом для разработки на PHP c Laravel.

    По факту тебе нужно просто создавать директории в Windows, а в конфигурационном файле Homestead.yaml указывать путь в Windows и путь в Ubuntu, а также хост для запуска. Грубо говоря, проект будет крутиться на виртуальном линухе (как и в своей естественной среде, на проде, например), а ты сможешь юзать винду и запускать
    их в браузере.

    Учитывая какие вопросы ты задаешь лучше разобраться со всем последовательно, что такое вируальные машины и как они работают (VirtualBox если его используешь), зачем нужен Vagrant и как с ним работать. А также разобраться с Homestead.yaml, а точнее один раз настроить и забыть (прокинуть ssh-ключи, научиться писать пути, а также добавлять хосты в файл hosts), про это в офф. документации написано все подробно и правильно, лучше чем там я не напишу.
    Ответ написан
    Комментировать
  • Как получить последний элемент пути?

    Lyrium
    @Lyrium
    Web developer
    Если необходимо без массивов и регулярок можно попробовать basename:
    $test = 'a/b/c'; // прямые слеши.
    echo basename($test); // результат 'c'
    
    echo PHP_EOL;
    
    $test2 = 'a\b\c';
    $test2 = str_replace('\\', '/', $test2); // обратные слеши заменяем на прямые. 
    echo basename($test2); // результат 'c'


    Но это не самые элегантные решения.
    Ответ написан
  • Как реализовать API для записи данных с внешнего ресурса?

    Lyrium
    @Lyrium
    Web developer
    Напишите API для нужных вам постов. Подойдет роут apiResource (это методы index, show, store, update, destroy)
    опишите их все отдельно в подходящем контроллере. Так будет удобнее в будущем, что логика для API находится обособленно.

    И в стороннем приложении просто используете полученные endpoint'ы от основного.
    Нужно получить все посты, условно GET blog.com/api/posts, обновляем пост PUT blog.com/api/posts/{post_id} и т.п.
    Ответ написан
  • Как дописать данные в поле таблицы, добавив до того что там уже есть?

    Lyrium
    @Lyrium
    Web developer
    Как понимаю если вы сохраняете массив в поле string в БД, то вы этот массив скорее всего кодируете в JSON чтобы записать как строку. Верно?

    Как вариант:
    $array = json_decode($model->field); // декодируем string в array
    $data = ['массив которым хотим дополнить', 'поле'];
    $array = array_merge($array, $data); // объединяем массивы
    $model->field = json_encode($array); // кодируем и сохраняем
    $model->save();
    Ответ написан
  • Как получить самые продаваемые товары Laravel?

    Lyrium
    @Lyrium
    Web developer
    Добрый день, добавьте сортировку в нужном для вас порядке.

    $bestProductIds = Order::get()->map->products->flatten()->map->pivot->mapTogroups(function ($pivot) {
                return [$pivot->product_id => $pivot->count];
            })->map->sum()->sortDesc()->take(3)->keys()->toArray();
            
            $bestProductIdsStr = implode(',', $bestProductIds);
            $bestProducts = Product::whereIn('id', $bestProductIds)
                ->orderByRaw(DB::raw("FIELD(id, $bestProductIdsStr)"))
                ->get();
    Ответ написан
    1 комментарий
  • Проверка наличия файла при помощи is_file()!?

    Lyrium
    @Lyrium
    Web developer
    is_file() вернет false, если указанный путь указывает на каталог, file_exists() вернет true, если данный путь указывает на допустимый файл или каталог. Смысл в том, что не одно лучше другого, а функции отличаются по смыслу и их нужно использовать своевременно.

    Если хотите точно знать, является что-то файлом или нет, используйте is_file(), в противном случае используйте file_exists().
    Ответ написан
    2 комментария
  • Как осортировать посты юзера по дате создания?

    Lyrium
    @Lyrium
    Web developer
    Вам нужно получить посты одного юзера
    $user = User::find($id);
    $posts = $user->posts; // Если есть связь от одного пользователя.
    
    return response()->json($posts->sortByDesc('created_at')); // и вызвать сортировку коллекции.


    Плюс нужно понимать различия:
    1) orderBy это сортировка в QueryBuilder, в SQL грубо говоря Прочесть тут. Поэтому в вашем случае писало что нет такого метода ибо у коллекции вызывали его.

    как вариант с orderBy
    $posts = Post::where('user_id', '=', $user_id)
    ->orderBy('created_at', 'desc')
    ->get();
    
    return response()->json($posts);


    2) А sortBy / sortByDesc сортируют готовую коллекцию Почитать тут (пример выше).
    Ответ написан
    8 комментариев
  • Как чётные элементы массива сделать ключами, а нечётные значениями нового массива?

    Lyrium
    @Lyrium
    Web developer
    циклом (foreach проще всего) перебери и сохрани все в новый массив, согласно необходимым условиям
    Ответ написан
    Комментировать
  • Как можно сократить код?

    Lyrium
    @Lyrium
    Web developer
    Вот так, как вариант, можно сократить.

    $query = Post::whereCategoryId($request->posts_type);
    
    if (!empty($request->building_id)) {
        $query = $query->with('buildings');
    } else {
        $query = $query->whereHas('buildings', function ($query) use ($request) {
                $query->whereId($request->building_id);
            });
    }
    
    $posts = $query->published()
        ->latest('published_at')
        ->offset(($request->page - 1) * 6)
        ->take(6)
        ->get();
    Ответ написан
    Комментировать
  • Как испровать ошибку миграции seeder?

    Lyrium
    @Lyrium
    Web developer
    Во первых выполните composer dump-autoload раз в ошибке указано что класса нет.

    А также в DatabaseSeeder лучше вызывать описанные сидеры, т.е. создавать в этой же директории классы например UsersTableSeeder.php и делать логику заполнения БД для этой таблицы в рамках этого класса, а затем в DatabaseSeeder в методе run вызывать класс для каждой таблицы.

    /**
         * Seed the application's database.
         *
         * @return void
         */
        public function run()
        {
            $this->call(UsersTableSeeder::class);
        }
    Ответ написан
    5 комментариев
  • Eloquent Laravel (многие ко многим) как получить данные через промежуточную таблицу?

    Lyrium
    @Lyrium
    Web developer
    Для более удобной работе c Eloquent стоит правильно формировать архитектуру.

    В вашем случае правильнее будет создать промежуточную Pivot модель с описанием необходимых связей (users, products).

    class Feedback extends Pivot
    {
        public function users()
        {
            return $this->belongsTo(User::class);
        }
    
        public function products()
        {
            return $this->belongsTo(Product::class);
        }
    }


    затем уже в моделях Пользователя или Товара используйте эту pivot-model для создания правильной связи.

    class User extends Authenticatable
    {
    ...
    
        public function products()
        {
            return $this->belongsToMany(Product::class,
                'feedback', 'user_id', 'product_id')
                ->using(Feedback::class)
                ->withTimestamps();
        }
    }
    
    class Product extends Model
    {
    ...
    
        public function users()
        {
            return $this->belongsToMany(User::class,
                'feedback', 'product_id', 'user_id')
                ->using(Feedback::class)
                ->withTimestamps();
        }
    }
    Ответ написан
    Комментировать
  • Что делает Guard и для чего он нужен?

    Lyrium
    @Lyrium
    Web developer
    О том что ищете можно почитать в офф. документации или в переводе

    Вырезки из перевода:
    Guards, "гарды", "охранники". Это по сути правила аутентификации пользователя - в каких частях запроса хранить информацию о том, что данный запрос идет от аутентифицированного пользователя. Например, это можно делать в сессии/куках, или в некотором токене, который должен содержаться в каждом запросе. В Laravel это гарды session и token соответственно.

    Вы также можете назначить специфичный гард для обработки процесса аутентификации. Для этого создайте свойство guard в вашем классе AuthController. Значением этого свойства должно быть название одного из гардов, определённых вами в файле config/auth.php.

    protected $guard = 'admin';

    Вы можете явно задать, при помощи какого гарда обслуживать процесс авторизации. Это позволит вам иметь в приложении несколько частей, вход в которые осуществляется по своим правилам. Пользователь может быть залогинен в одну из них, или несколько. Самый простой пример - это админка. Ваш гард admin определяет правило, залогинен данный пользователь как админ, или нет - например, установкой специальной куки.

    Тогда при логине в админку вы делаете так:

    if (Auth::guard('admin')->attempt($credentials)) {
        //
    }


    Вы также можете явно указать гард, при помощи которого будете фиксировать процесс аутентификации.

    Auth::guard('admin')->login($user);

    Также можно создать свой кастомный гард, почитать об этом тут
    Ответ написан
    Комментировать
  • Как правильно разворачивать проект ларавел?

    Lyrium
    @Lyrium
    Web developer
    В целом можно как угодно извращаться на сколько хватит фантазии. Предлагаю сделать так:

    стянуть себе на локальную машину (виртуалку) Laravel
    composer create-project --prefer-dist laravel/laravel project-name


    Сделать изменения и заливать их в репозиторий на гите.
    Оттуда (из гита) деплоить на хостинг.

    upd:
    Если нет ssh доступа к хостингу, то можно будет "финальный релиз" загрузить вручную по ftp.
    Ответ написан
    3 комментария
  • Регулярные выражения - совпадение только на один обратный слеш?

    Lyrium
    @Lyrium
    Web developer
    В регулярном выражении обратный слеш экранирует спецсимволы. Т.е. во втором варианте вы экранировали слеш слешем. Чтобы было правильно нужно использовать еще один слеш.

    $str = 'v\a';
    var_dump(preg_match("/^(v\\\\a)$/", $str, $matches));  // true
    
    $str2 = 'v\\\a';
    var_dump(preg_match("/^(v\\\\a)$/", $str2, $matches));  // false
    Ответ написан
    Комментировать
  • На каком этапе обучения вы начинали искать свою первую работу?

    Lyrium
    @Lyrium
    Web developer
    привет, расскажу свою историю :)

    Искать работу начал после полугодовалого обучения дома, после работы. В тот момент был сис. админом и изучал web, а именно php + html + css + mySql. Знаний было мало, основы php, c++, c#, python. Всего понемногу и считай ничего нигде, но мало мальски ерунду везде мог сделать.

    Написал сайт "Блог" на Codeigniter 2, а потом на Laravel недо-интернет магазин.

    Решил что уже пора и за, примерно, 3 недели нашел первую работу программистом, удаленно, за копейки. Узнал там про git, подтянул JavaScript до уровня "Слабый джун" и через 3 месяца уже ушел, тоже в не очень хорошее место, но поприятнее.

    Самое важно это понимать то, что чтобы Вас взяли на работу Вы должны иметь возможность предложить что-то работодателю и уметь себя преподнести в лучшем свете (только совсем нагло не обманывать, т.к. такое всплывет моментально)
    Ответ написан
    Комментировать