Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 Re: Laravel 5.x » Запрос к отношению » 14.09.2017 16:56:24

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

$user->days->filter(function ($day) {return $day->date == '2017-09-01';})->users->sum('amount')

Есть еще одно отношение

class User extends Model
{
public function days() {
   return $this->belongsToMany('App\Models\OrderDay', 'order_users', 'user_id', 'day_id');
}

#2 Laravel 5.x » Запрос к отношению » 14.09.2017 16:24:38

Punchos
Ответов: 4

Есть таблицы

users
    id - integer
    name - string

order_users
    id - integer
    user_id - integer
    day_id - integer
    amount - integer

order_days
    id - integer	
    date - date

отношения

class User extends Model
{
  public function orders() {
        return $this->hasMany('App\Models\OrderUser', 'user_id');
  }
}	
...
class OrderUser extends Model
{    
    public function day() {
        return $this->belongsTo('App\Models\OrderDay', 'day_id', 'id');
    }

    public function user() {
        return $this->belongsTo('App\User', 'user_id', 'id');
    }

}

Вопрос: мы получили всех пользователей с именем Иван:

$users = \App\User::where('name', 'Иван')->get();

Как теперь для каждого из них получить общую сумму, за работу с 1.09 по 3.09?

#3 Re: Laravel 5.x » User $user with role » 08.08.2017 14:25:48

Если ты проверяешь только текущего пользователя, то ты можешь "подгрузить" связь в посреднике, например:

А куда это вставить единоразово, чтобы везде auth()->user() уже была подгружена связь?
Подобная проверка используется во всех политиках на проекте.

#4 Re: Laravel 5.x » User $user with role » 07.08.2017 16:21:43

Не помогло. Теперь вместо запросов

select * from `user_groups` where `user_groups`.`id` = '3' limit 1

они стали

select * from `user_groups` limit 1

#5 Laravel 5.x » User $user with role » 07.08.2017 15:39:33

Punchos
Ответов: 5

Здравствуйте!
Есть метод в Политике

namespace App\Policies;

use Illuminate\Auth\Access\HandlesAuthorization;
use App\User;

class UserPolicy
.....
public function index(User $user) {
        return in_array($user->group()->first()->name, ['Admin', 'Moderator']);
    }

Каждый раз выполняется запрос получения группы. Где в движке laravel необходимо один раз выполнить with('group') ?

#6 Laravel 5.x » custom 404 и middleware » 24.02.2017 11:35:57

Punchos
Ответов: 0

На морде сайта в шапке и футеры телефоны, адрес и прочие данные выводятся из настроек хранящихся в базе. Для получения к роутам добавил 'middleware' => 'settings', где получаю данные и глобально передаю в шаблон View::share.
Проблема в том, что если срабатывает исключение и мы попадаем в render() App\Exceptions\Handler, то там моего  'middleware' => 'settings' нету. Можно его прописать в Kernel

protected $middleware = [
        \App\Http\Middleware\Settings::class,
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    ];

Но тогда он будет всегда отрабатывать и на морде, и в админке, а мне этого ни надо.
Как можно победить эту беду?

И так же не срабатывает web на 404, а мне нужны сессии чтобы проверить авторизацию и для админке иначе рендерить 404.

#7 Re: Laravel 5.x » Insert дополнительных данных в pivot-таблицу из двух input-ов » 24.02.2017 11:25:33

https://laravel.ru/docs/v5/eloquent-rel … ps#вставка
создать связь

->create(['name' => 'store_name'] , ['amount' => $amount]);

присоединить

->attach($id, ['amount' => $amount]);

синхронизировать

->sync([$id1 => ['amount' => $amount1], $id2 => ['amount' => $amount1]]);

#8 Re: Laravel 5.x » На сервере выскакивает ошибка Session » 16.02.2017 11:22:20

constb пишет:

ну во-первых, в стек-трейсе нет миддлварь, характерных для web – видимо какие-то из них отключены или ошибка произошла до того как они сработали. судя по NotFoundException – маршруты не загрузились вообще и запрос сразу ушёл на ошибку 404. затем при рендере шаблона ошибки (видимо errors/404.blade.php) произошла ошибка, но не в самом шаблоне, а видимо в инклюде, который включен из лейаута (три вложенных срабатывания шаблонизатора, полагаю 404 -> layout -> include) при попытке вызова old('name') – видимо форма авторизации или регистрации. ошибка из-за того что не загружена сессия – на 404й и прочих ошибках никакие миддлвари не выполняются.

надо начинать с причины почему маршрут не был распознан, а затем – исправить шаблон формы авторизации/регистрации чтобы не пытался вызывать old() на маршрутах, где нет сессии. или вообще не рендерить лейаут на 404й ошибке, а отрисовать шапку прямо в самом шаблоне 404 (кстати ларавель по умолчанию именно так и делает)

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

#9 Re: Laravel 5.x » Изменение Request до отработки Controller » 10.02.2017 13:36:27

skiphog пишет:

Да, в версиях ниже нет такого... видимо добавили позже, но тогда можно написать свой метод и вызвать до валидации.

Так работает, большое спасибо.

#10 Re: Laravel 5.x » Изменение Request до отработки Controller » 10.02.2017 12:51:57

skiphog пишет:

Как вариант, переопределить метод prepareForValidation() в CategoryRequest

class CategoryRequest extends Request
.....

protected function prepareForValidation()
{
  if(empty($this->request->get('sysname'))) {
    $this->request->set('sysname', Slug::make($this->request->get('name'), '_'));
      // Ну или еще как...
    }
  }


public function rules()
    {
        return [
            'id_parent' => 'exists:categories,id',
            'name' => 'required',
            'sysname' => 'sysname|unique:categories,sysname,'.$this->route('categories'),
            'icon' => 'image'
        ];
    }

Т.е. получается, что перед валидацией проверяем, если пустой sysname, то вставляем значение, которое нужно.

Так будет точно работать, но... возможно, можно как-то и по другому...

Не работает, в prepareForValidation даже не заходит. В документации такого метода не нашел. Уверены в его существовании?

#11 Laravel 5.x » Изменение Request до отработки Controller » 10.02.2017 11:06:50

Punchos
Ответов: 5

Перед методом контроллера данный валидируются:

class CategoryRequest extends Request
.....
public function rules()
    {
        return [
            'id_parent' => 'exists:categories,id',
            'name' => 'required',
            'sysname' => 'sysname|unique:categories,sysname,'.$this->route('categories'),
            'icon' => 'image'
        ];
    }

В контроллере если sysname не заполнен, то мы генерим его из name

public function store(\App\Http\Requests\admin\CategoryRequest $request) {
$data = $request->all();
$data['sysname'] = $data['sysname']  ?: Slug::make($data['name'], '_');

После чего нам необходимо опять проверить значение на уникальность в таблице.
Вопрос: как можно проверить $request->input('sysname') на пустоту и подставить значение до отработки CategoryRequest  чтобы избежать повторной проверки?

#12 Re: Laravel 5.x » На сервере выскакивает ошибка Session » 01.02.2017 17:25:40

constb пишет:

что прописано в качестве SESSION_DRIVER в .env?

file

#13 Laravel 5.x » На сервере выскакивает ошибка Session » 01.02.2017 16:04:13

Punchos
Ответов: 5

На сервере в лог сыпет такая ошибка:

[2017-02-01 13:01:50] local.ERROR: exception 'RuntimeException' with message 'Session store not set on request.' in /home/u470042/new.anapa-rodnik.com/www/vendor/laravel/framework/src/Illuminate/Http/Request.php:870
Stack trace:
#0 /home/u470042/new.anapa-rodnik.com/www/vendor/laravel/framework/src/Illuminate/Http/Request.php(545): Illuminate\Http\Request->session()
#1 /home/u470042/new.anapa-rodnik.com/www/vendor/laravel/framework/src/Illuminate/Foundation/helpers.php(501): Illuminate\Http\Request->old('name', NULL)
#2 /home/u470042/new.anapa-rodnik.com/www/storage/framework/views/f0afccc975c73b51e2d30ecbcb71e478e87fb2bb.php(9): old('name')
#3 /home/u470042/new.anapa-rodnik.com/www/vendor/laravel/framework/src/Illuminate/View/Engines/PhpEngine.php(42): include('/home/u470042/n...')
#4 /home/u470042/new.anapa-rodnik.com/www/vendor/laravel/framework/src/Illuminate/View/Engines/CompilerEngine.php(59): Illuminate\View\Engines\PhpEngine->evaluatePath('/home/u470042/n...', Array)
#5 /home/u470042/new.anapa-rodnik.com/www/vendor/laravel/framework/src/Illuminate/View/View.php(149): Illuminate\View\Engines\CompilerEngine->get('/home/u470042/n...', Array)
#6 /home/u470042/new.anapa-rodnik.com/www/vendor/laravel/framework/src/Illuminate/View/View.php(120): Illuminate\View\View->getContents()
#7 /home/u470042/new.anapa-rodnik.com/www/vendor/laravel/framework/src/Illuminate/View/View.php(85): Illuminate\View\View->renderContents()
#8 /home/u470042/new.anapa-rodnik.com/www/storage/framework/views/5578dc696675b17ca7ea4d38aa7117c5b4537ed8.php(21): Illuminate\View\View->render()
#9 /home/u470042/new.anapa-rodnik.com/www/vendor/laravel/framework/src/Illuminate/View/Engines/PhpEngine.php(42): include('/home/u470042/n...')
#10 /home/u470042/new.anapa-rodnik.com/www/vendor/laravel/framework/src/Illuminate/View/Engines/CompilerEngine.php(59): Illuminate\View\Engines\PhpEngine->evaluatePath('/home/u470042/n...', Array)
#11 /home/u470042/new.anapa-rodnik.com/www/vendor/laravel/framework/src/Illuminate/View/View.php(149): Illuminate\View\Engines\CompilerEngine->get('/home/u470042/n...', Array)
#12 /home/u470042/new.anapa-rodnik.com/www/vendor/laravel/framework/src/Illuminate/View/View.php(120): Illuminate\View\View->getContents()
#13 /home/u470042/new.anapa-rodnik.com/www/vendor/laravel/framework/src/Illuminate/View/View.php(85): Illuminate\View\View->renderContents()
#14 /home/u470042/new.anapa-rodnik.com/www/storage/framework/views/ad1ea80fc83c66943315e9c603a3b7ea3fc944a7.php(38): Illuminate\View\View->render()
#15 /home/u470042/new.anapa-rodnik.com/www/vendor/laravel/framework/src/Illuminate/View/Engines/PhpEngine.php(42): include('/home/u470042/n...')
#16 /home/u470042/new.anapa-rodnik.com/www/vendor/laravel/framework/src/Illuminate/View/Engines/CompilerEngine.php(59): Illuminate\View\Engines\PhpEngine->evaluatePath('/home/u470042/n...', Array)
#17 /home/u470042/new.anapa-rodnik.com/www/vendor/laravel/framework/src/Illuminate/View/View.php(149): Illuminate\View\Engines\CompilerEngine->get('/home/u470042/n...', Array)
#18 /home/u470042/new.anapa-rodnik.com/www/vendor/laravel/framework/src/Illuminate/View/View.php(120): Illuminate\View\View->getContents()
#19 /home/u470042/new.anapa-rodnik.com/www/vendor/laravel/framework/src/Illuminate/View/View.php(85): Illuminate\View\View->renderContents()
#20 /home/u470042/new.anapa-rodnik.com/www/storage/framework/views/482388eb7aa8285519b5314b2c2be088f4c0b8b2.php(12): Illuminate\View\View->render()
#21 /home/u470042/new.anapa-rodnik.com/www/vendor/laravel/framework/src/Illuminate/View/Engines/PhpEngine.php(42): include('/home/u470042/n...')
#22 /home/u470042/new.anapa-rodnik.com/www/vendor/laravel/framework/src/Illuminate/View/Engines/CompilerEngine.php(59): Illuminate\View\Engines\PhpEngine->evaluatePath('/home/u470042/n...', Array)
#23 /home/u470042/new.anapa-rodnik.com/www/vendor/laravel/framework/src/Illuminate/View/View.php(149): Illuminate\View\Engines\CompilerEngine->get('/home/u470042/n...', Array)
#24 /home/u470042/new.anapa-rodnik.com/www/vendor/laravel/framework/src/Illuminate/View/View.php(120): Illuminate\View\View->getContents()
#25 /home/u470042/new.anapa-rodnik.com/www/vendor/laravel/framework/src/Illuminate/View/View.php(85): Illuminate\View\View->renderContents()
#26 /home/u470042/new.anapa-rodnik.com/www/vendor/laravel/framework/src/Illuminate/Http/Response.php(53): Illuminate\View\View->render()
#27 /home/u470042/new.anapa-rodnik.com/www/vendor/symfony/http-foundation/Response.php(201): Illuminate\Http\Response->setContent(Object(Illuminate\View\View))
#28 /home/u470042/new.anapa-rodnik.com/www/vendor/laravel/framework/src/Illuminate/Routing/ResponseFactory.php(57): Symfony\Component\HttpFoundation\Response->__construct(Object(Illuminate\View\View), 404, Array)
#29 /home/u470042/new.anapa-rodnik.com/www/vendor/laravel/framework/src/Illuminate/Routing/ResponseFactory.php(71): Illuminate\Routing\ResponseFactory->make(Object(Illuminate\View\View), 404, Array)
#30 /home/u470042/new.anapa-rodnik.com/www/vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php(156): Illuminate\Routing\ResponseFactory->view('errors.404', Array, 404, Array)
#31 /home/u470042/new.anapa-rodnik.com/www/vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php(113): Illuminate\Foundation\Exceptions\Handler->renderHttpException(Object(Symfony\Component\HttpKernel\Exception\NotFoundHttpException))
#32 /home/u470042/new.anapa-rodnik.com/www/app/Exceptions/Handler.php(56): Illuminate\Foundation\Exceptions\Handler->render(Object(Illuminate\Http\Request), Object(Symfony\Component\HttpKernel\Exception\NotFoundHttpException))
#33 /home/u470042/new.anapa-rodnik.com/www/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(80): App\Exceptions\Handler->render(Object(Illuminate\Http\Request), Object(Symfony\Component\HttpKernel\Exception\NotFoundHttpException))
#34 /home/u470042/new.anapa-rodnik.com/www/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(54): Illuminate\Routing\Pipeline->handleException(Object(Illuminate\Http\Request), Object(Symfony\Component\HttpKernel\Exception\NotFoundHttpException))
#35 /home/u470042/new.anapa-rodnik.com/www/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode.php(44): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#36 [internal function]: Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode->handle(Object(Illuminate\Http\Request), Object(Closure))
#37 /home/u470042/new.anapa-rodnik.com/www/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(136): call_user_func_array(Array, Array)
#38 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#39 /home/u470042/new.anapa-rodnik.com/www/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(32): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#40 [internal function]: Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#41 /home/u470042/new.anapa-rodnik.com/www/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
#42 /home/u470042/new.anapa-rodnik.com/www/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(132): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#43 /home/u470042/new.anapa-rodnik.com/www/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(99): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter(Object(Illuminate\Http\Request))
#44 /home/u470042/new.anapa-rodnik.com/www/public/index.php(54): Illuminate\Foundation\Http\Kernel->handle(Object(Illuminate\Http\Request))
#45 {main}

route:list говорит что middleware => web прописан для всех маршрутов, Сессии работают, но логи засоряются вот такой ерундой. При чем на локалке такого нет.

#14 Re: Laravel 5.x » Form checkbox » 16.01.2017 13:34:14

Тоже столкнулся с данной бедой, можно как-нибудь красиво в ларе избавиться от проверки?

        $data = $request->input();
        if(empty($data['is_menu'])) {
            $data['is_menu'] = false;
        }
        ServiceCategory::create($data);

#15 Re: Laravel 5.x » next и prev для модели » 13.01.2017 15:41:44

Да это только для маленькой таблицы подходит, я это понимаю. По контексту там ни когда не будет больше 50 записей

#16 Re: Laravel 5.x » next и prev для модели » 13.01.2017 15:19:52

AlexeyMezenin пишет:

Готового решения нет, но можно использовать коллекции.

public static function getPrevNext($category, $attribute = 'id') {
    $current = $category->getAttribute($attribute);
    $cats = ServiceCategory::orderBy($attribute)->get();
    return [
        'prev' => $cats->where($attribute, '<', $current)->first() ?: $cats->last(),
        'next' => $cats->where($attribute, '>', $current)->first() ?: $cats->first(),
    ];
}

Спасибо за правильное направление, узнал для себя о коллекциях)) (вторую неделю в ларе ковыряюсь). Только ваш код не совсем корректен, в where нельзя указывать операции сравнения, корректный код выглядит так:

public static function getPrevNext($category, $attribute = 'id') {
        $current = $category->getAttribute($attribute);
        $cats = ServiceCategory::get();
        return [
            'prev' => $cats->filter(function ($item) use ($current, $attribute) {
                            return $current > $item->getAttribute($attribute);
                        })->sortByDesc($attribute)->first() ?: $cats->last(),
            'next' => $cats->filter(function ($item) use ($current, $attribute) {
                            return $current < $item->getAttribute($attribute);
                      })->sortBy($attribute)->first() ?: $cats->first()
        ];
    }

#17 Laravel 5.x » next и prev для модели » 12.01.2017 17:08:23

Punchos
Ответов: 9

Здравствуйте!
Есть задача на странице категории получать предыдущую и следующую категорию в списке отсортированном допустим по id(а вообще как угодно). При том чтобы список был зациклен, то есть для последней категории, следующей будет первая.
Написал, такой метод в модели

public static function getPrevNext($category, $attribute = 'id') {
        $cats = ServiceCategory::orderBy($attribute)->get();
        $prev = $cats->last();
        $next = '';
        foreach ($cats as $cat) {
            if($cat->getAttribute($attribute) == $category->getAttribute($attribute)) {
                continue;
            }
            if($category->getAttribute($attribute) > $cat->getAttribute($attribute)) {
                $prev = $cat;
            }
            if(!$next && $category->getAttribute($attribute) < $cat->getAttribute($attribute)) {
                $next = $cat;
            }
        }
        if(!$next) {
            $next = $cats->first();
        }
        return ['prev' => $prev, 'next' => $next];
    }

Но что-то он мне совсем не нравится. Возможно есть в ларе уже что то готовое для моей задачи?

#18 Re: Laravel 5.x » Уточняющее hasMany и with » 10.01.2017 15:12:04

AlexeyMezenin пишет:

Загружай страницы сразу с pageVar:

    Page::with('vars')->find($id);

Потом:

    {{ $page->vars->where('var', 'services')->first()->value }}

Вначале так и пробовал, но в этом случае если services не существует(а по контексту такое возможно), тогда будет ошибка

Trying to get property of non-object

#19 Laravel 5.x » Уточняющее hasMany и with » 10.01.2017 13:21:27

Punchos
Ответов: 3

Добрый день!
Есть модель Page

    protected $fillable = ['sysname', 'content'];

    public function vars() {
        return $this->hasMany('App\PageVar', 'page_id');
    }

    public function getVar($var) {
        $page_var = $this->hasMany('App\PageVar', 'page_id')->where('var', $var)->first();
        return ($page_var ? $page_var->value : null);
    }

и связанная с ней PageVar

    protected $fillable = ['page_id', 'var', 'value'];

    public static $rules = ['var' => 'sysname'];

    public function page() {
        return $this->belongsTo('App\Page');
    }

Служат для того чтобы управлять, контентом на статичных страницах. В pages основное содержание, в page_vars мелкие фразы на странице.

Обращаюсь к этому в шаблонах так:

{{$page->getVar('services')}}

Но в этом случае не отрабатывает

with('vars')

И для каждого getVar, выполняется запрос в базу.
Вообще getVar создал потому что в случае

{{$page->vars->where('var', 'services')->first()->value}}

если services не создана, то выскакивает ошибка.
Помогите, как это правильно организовать?

Подвал раздела