Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Вам нужен $validator->sometimes
На сколько я могу судить тут речь даже не о безопасности должна идти а об избыточном использовании связей, а это может привезти к нагрузке бд.
В вашем примере что бы вытянуть нужные данные вам придется использовать чрезмерное количество запросов к бд что бы вытащить нужные данные. Конечно я могу и ошибаться т.к я не знаю как именно будут афишироваться данные пользователю.
А зачем все статьи из базы кешировать?
Сам до конца не понял. Поставлена такая задача по ТЗ, значит надо решить.
Получается единственный выход это каждый раз при добавления/обновления/удаления придется через Cache::forget(), чистить все записи из кэша !? Другого способа нет?
Была конечно идея каждую отдельную кешировать через Cache::put('article-'.$this->id); а потом сравнивать бд и кеш и при не соответствии подтягивать изменённую статью или удалять при отсутствии, но как по мне это полный аншлаг. Куча ненужных записей и if внутри foreach который только увеличит время обработки что в корне убивает смысл использования Cache.
Может у кого есть ещё идеи по реализации !
P.S на счёт кеширования всех записей -> я так понимаю что это надо не только для front, и задача такая по тому что заказчик хочет чтобы в админке так же все записи были закешированы .
Доброго времени суток. Не могу до конца понять как работает Кэш в ларе.
Значит ситуация такая. Допустим есть модель Articles.
class Article {
public function getArticles() {
$articles = Cache::remember('articles', 24*60, function () {
return Article::with('lang')->get();
});
return $articles;
}
}
Как при удалении какой то существующей статьи, удалить ее из кэша в том числе ? Или как при добавлении новой статьи так же добавить ее в уже существующий кеш ?
На сколько я понял из документации метод remember должен автоматически чистить/добавлять записи в указанный кеш. Правильно ли я понял ? По тому что если да то почему-то на Laravel 5.4 работает это не совсем как ожидается. При добавлении/удалении записи она удаляется из бд но остается в кеше, а ведь я показываю то что в кеше. При таком раскладе получается что при использование CRUD-a мне надо в начале всех методов (store, update, destroy), вбивать Cache::forget('articles'), то бишь удалять все записи из кэша что бы потом закешировать актуальные данные из бд. Все это не было бы так принципиально, да вот что делать если у меня будут 5000 записей в бд ? Получается если я добавлю/удалю какую-то статью у меня произойдет запрос на 5000 записей. Как можно этого избежать или какие альтернативы можно использовать/применить? Заранее спасибо за предоставленную помощь !!!
P.S используемый драйвер - file
Есть таблица в бд и я знаю что там 5 колонок (пр. name, surname, dob, created_at, updated_at).
А если я изначально не знаю сколько там колонок и их имя как узнать количество (count) колонок и их название.
Заранее спасибо!
UPD1: По идее конструкция дожна выглядеть примерно так
foreach ($items as $item) {
$number = count($item->attributes());
foreach($item->attributes() as $key => $value) {
echo $key.' = '.$value;
}
}
данная конструкция конечно же не работает, как ее довести до ума !?
Есть коллекция 0 => 'somedata', 1 => 'somedata2' .....
Как в этой коллекции заменить все ключи (т.е 0,1,2,3...) на 'name', что бы в итоге получилось name => 'somedata', name => 'somedata2'.....
смысл всего этого в том что бы после такой манипуляции можно было использовать $data->where('name','=','somedata*')
Спасибо заранее!
Используйте Eloquent
Есть таблица Offers с полями price и points.
Предположим есть 10 offers нужно из них посчитать по нарастанию первые 3 у которых наименьшая цена и наибольшее количество очков.
Подскажите как это можно сделать. Спасибо заранее !
Спасибо большое за ответ, в принципе до того как вы ответили я использовал именно такой способ который вы описали в предыдущем сообщении.
Ещё раз благодарю за участие!
Является ли описанный вами метод самым правильным или есть и другой способ ??? Спасибо!
Доброго времени суток.
Есть таблица articles (id, name,...,status,timestamps)
Задача состоит в том что бы через определенное количество времени после того как article опубликован (скажем 2 часа), скрыть его, то есть сменить status.
Как такое можно реализовать на laravel? Заранее спасибо !!!
Прикрепите лог лары
Не хватает деталей
каких именно деталей не хватает ? я дополню !
А какие причины то?
Что можно сказать, не зная конкретики?
Ну к примеру есть несколько контроллеров с одинаковой сущностью. По типу новости - блог. На данный момент не вижу смысла держать несколько контроллеров с почти одинаковым кодом. Если все же взглянуть на обратную сторону монеты, то при изменение одной из сущностный от других, нужно будет либо заполнять контроллер if-ами либо отделять в отдельный контроллер.
Вообще какие best practices есть на этот счет ?))
Привет всем, пришла мне идея в одном проекте соединить несколько контроллеров в один. Хотелось бы послушать ваше мнение на этот счет. На сколько это хорошая практика, и стоит ли вообще. Проект маленкий к среднему. Буду рад любому мнению!
Я всегда админку закрываю посредником (middleware)
В web.php
Route::resource('photos', 'PhotoController');
Ресорс контроллер изначально поставляется с базовыми методами (index, create, store, show, edit, update, destroy)
Дописываешь
public function __construct()
{
$this->middleware('checkRole'); //тут название твоего посредника
}
если все же хочешь определить данного посредника для группы роутов то так:
Route::group(['middleware' => 'checkRole'], function()
{
Route::resource('photos', 'PhotoController');
});
не будет ли это логичнее сделать в группе роутов?
А если к примеру потом надо будет эти данные приделовать и ко второй, третей группе роутов? Будете дублировать код ?
Тут по сути все просто прописали ресоурс роут и в конструкте контроллера указали посредника )
а как тут данные то прицепить?????
public function handle($request, Closure $next)
{
View::share('isadmin', User::isAdmin());
View::share('isclient', User::isClient());
View::share('ismaster', User::isMaster());
//ну или если хочешь сохранить пару строк то так
View::share(['isadmin' => User::isAdmin(), 'isclient' => User::isClient(), 'ismaster' => User::isMaster]);
return $next($request);
}
В любом из этих двух вариантов isadmin, isclient, ismaster можно будет использовать как переменные во вьюхе.
Только не забудь use View прописать в посреднике и в конструкте контроллера этого самого посредника!
Представьте таблице.
Regions ->hasMany (departments)
Departments ->hasmany(Langs)
Как при удаление экземпляра Region удалить все department_langs если foreign key не могу использовать т.к исползываются полиморфные связи.
Пытался так
$region = Region::find($id);
foreach($region->departments as $department)
{
$department->langs->delete();
}
$region->department->delete();
$region->delete();
Получаю -> method delete not found на строке где $department->langs->delete();
Как быть!? Спасибо заранее!
например для целой группы роутов выполнять функцию получения роли, как это будет выглядеть?
Во вьюхе этого делать не стоит.
Или ничего страшного, если роль дергается прямо из вьюхи?
Для таких целей все же лучше всего использовать Middleware
добавьте поле типа таблицы в таблицу с переводами, а в основную модель метод который возвращает по ид и этому полю-типу строки
Я так понимаю вы сейчас говорите про полиморфные связи.
Достаточно, спасибо за внятное объяснение
Хорошо, а если предположим я собираюсь сделать таблицу в которой хранятся меню. Где parent_id это id записи в этой же таблице. Тогда как быть ?
Малого количества таблиц