Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Дело в том, что мне нужно в шаблоне по каждой дате потом выводить сумму заработка, чтобы срабатывало вот так примерно:
$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');
}
Есть таблицы
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?
Если ты проверяешь только текущего пользователя, то ты можешь "подгрузить" связь в посреднике, например:
А куда это вставить единоразово, чтобы везде auth()->user() уже была подгружена связь?
Подобная проверка используется во всех политиках на проекте.
Не помогло. Теперь вместо запросов
select * from `user_groups` where `user_groups`.`id` = '3' limit 1
они стали
select * from `user_groups` limit 1
Здравствуйте!
Есть метод в Политике
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') ?
На морде сайта в шапке и футеры телефоны, адрес и прочие данные выводятся из настроек хранящихся в базе. Для получения к роутам добавил '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.
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]]);
ну во-первых, в стек-трейсе нет миддлварь, характерных для web – видимо какие-то из них отключены или ошибка произошла до того как они сработали. судя по NotFoundException – маршруты не загрузились вообще и запрос сразу ушёл на ошибку 404. затем при рендере шаблона ошибки (видимо errors/404.blade.php) произошла ошибка, но не в самом шаблоне, а видимо в инклюде, который включен из лейаута (три вложенных срабатывания шаблонизатора, полагаю 404 -> layout -> include) при попытке вызова old('name') – видимо форма авторизации или регистрации. ошибка из-за того что не загружена сессия – на 404й и прочих ошибках никакие миддлвари не выполняются.
надо начинать с причины почему маршрут не был распознан, а затем – исправить шаблон формы авторизации/регистрации чтобы не пытался вызывать old() на маршрутах, где нет сессии. или вообще не рендерить лейаут на 404й ошибке, а отрисовать шапку прямо в самом шаблоне 404 (кстати ларавель по умолчанию именно так и делает)
Спасибо, помогло. Вот только как Вы из этой белеберды трейса ошибок все это выяснили я ума не приложу))
Да, в версиях ниже нет такого... видимо добавили позже, но тогда можно написать свой метод и вызвать до валидации.
Так работает, большое спасибо.
Как вариант, переопределить метод 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 даже не заходит. В документации такого метода не нашел. Уверены в его существовании?
Перед методом контроллера данный валидируются:
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 чтобы избежать повторной проверки?
что прописано в качестве SESSION_DRIVER в .env?
file
На сервере в лог сыпет такая ошибка:
[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 прописан для всех маршрутов, Сессии работают, но логи засоряются вот такой ерундой. При чем на локалке такого нет.
Тоже столкнулся с данной бедой, можно как-нибудь красиво в ларе избавиться от проверки?
$data = $request->input();
if(empty($data['is_menu'])) {
$data['is_menu'] = false;
}
ServiceCategory::create($data);
Да это только для маленькой таблицы подходит, я это понимаю. По контексту там ни когда не будет больше 50 записей
Готового решения нет, но можно использовать коллекции.
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()
];
}
Здравствуйте!
Есть задача на странице категории получать предыдущую и следующую категорию в списке отсортированном допустим по 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];
}
Но что-то он мне совсем не нравится. Возможно есть в ларе уже что то готовое для моей задачи?
Загружай страницы сразу с pageVar:
Page::with('vars')->find($id);
Потом:
{{ $page->vars->where('var', 'services')->first()->value }}
Вначале так и пробовал, но в этом случае если services не существует(а по контексту такое возможно), тогда будет ошибка
Trying to get property of non-object
Добрый день!
Есть модель 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 не создана, то выскакивает ошибка.
Помогите, как это правильно организовать?
Страницы 1