Ответы пользователя по тегу Laravel
  • Как дебажить если 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
    Ответ написан
    Комментировать
  • Как реализовать 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 комментарий
  • Как осортировать посты юзера по дате создания?

    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
    Вот так, как вариант, можно сократить.

    $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();
    Ответ написан
    Комментировать
  • 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);

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

    Lyrium
    @Lyrium Автор вопроса
    Web developer
    Решением вопроса стал метод mapWithKeys()

    dd(FuwMapping::where('template','=','NB5215')->get()->mapWithKeys(function($item) use ($content) {
                return [$item->pdf_field => array_get($content, $item->json_field)];
            }));


    method-mapwithkeys

    результат:
    Collection {#412
      #items: array:7 [
        "Firm" => "Broker Dealer"
        "ProducerName" => "F. M.  Dostoevsky"
        "SSN" => "999-99-9999"
        "PhoneNumber" => "(999) 999-9999"
        "Email" => "test@test.com"
        "InsuredName" => null
        "InsuredBirth" => "01/01/1980"
      ]
    }
    Ответ написан
    Комментировать
  • Как работать с blade в laravel?

    Lyrium
    @Lyrium
    Web developer
    Blade шаблонизатор который помогает разграничить html и сделать работу с ним и вывод php данных более удобным и гибким.

    Разобраться что к чему не сложно blade прост для освоения, сейчас приведу несколько примеров с чего лучше начать:

    во первых разобраться с layout и с устройством шаблонизатора можно на примере кода который генерируется командой "php artisan make:auth" (базовая авторизация Laravel прочесть можно в офф. документации ссылка на авторизацию)
    Здесь сразу у вас будет пример с несколькими вьюхами и правильно построенным шаблоном в целом

    также можно ознакомиться с русскоязычной документацией описывающей blade довольно подробно ссылка на русский blade

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

    upd: Директива @section, как следует из её названия, определяет секцию содержимого, а директива @ yield используется для отображения содержимого заданной секции. Т.е. в то место где стоит yield попадает значение секции

    схематичный пример:

    есть файл app, в дирректории layouts
    layouts/app.blade.php
    <html>
    <head>
    	<title>
    		@yield('title', 'Laravel')
    	</title>
    
    	<!-- Styles -->
    	<link href="{{ asset('public/css/app.css') }}" rel="stylesheet">
    </head>
    <body>
    	<div id="app">
    		<div class="navbar">
    			...
    		</div>
    
    		<div class="container">
    			@yield('content')
    		</div>
    	</div>
    </body>
    </html>


    второй файл описывает то что попадет в указанную секцию
    products.blade.php
    @extends('layouts.app')
    
    @section('title', 'Products')
    
    @section('content')
    	@foreach($products as $product)
    		{{ $product }}
    	@endforeach
    @endsection

    В первом случае нет закрывающего @endsection из-за того что тело секции это и есть строка 'Products', во втором случае мы указываем конец секции, потому что тело секции находится между @section и @endsection
    Ответ написан
    7 комментариев