Laravel по-русски

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

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

#1 Re: Laravel 5.x » Как лучше организовать структуру урлов в Laravel? » 05.12.2017 11:50:50

sam
А как тогда лучше сделать структуру урлов, что бы не было этих лишних слов типа page, post, category, product? Что бы урлв были чистыми

#2 Laravel 5.x » Как лучше организовать структуру урлов в Laravel? » 04.12.2017 16:13:52

fenix1996l
Ответов: 2

Здравствуйте. Как лучше организовать структуру урлов в Laravel?

Сейчас в самописной админке есть: Страницы, записи.

При создании страницы можно выбрать тип ее, 1. просто страница 2.Страница для записей

При создании записи, мы выбираем на какую страницу(с типом «Страница для записей») уйдет запись. Создать запись без Страница с типом «Страница для записей» не получиться.

Я не хочу видеть в URl вот такие

test.com/pages/page_1
test.com/posts/post_1
test.com/category/category_1

PHP
Route::get('/{slug}''ContentController@get')->where('slug','^[a-zA-Z0-9-_\/]+$');

Этот роут обеспечивает выдачу URL вот в такой вид

test.com/page_1/post_1
test.com/page_1
test.com/category_1/product_1

Код самого кнотроллера

PHP
//разбивает url на массив
$content explode('/'$slug);
//Берет последний элемент массива
$end_slug end($content);

//Если размер массива $content равен 1, то мы делаем выборку из таблицы Page т.к. это не может запись
if(count($content) == 1)
{
$data Page::where('slug''='$end_slug)->where('visibility''='true)->first();

if(
$data == null)
{
abort(404);
}

//Указываем в какую view уйдут данные
$view 'page';
}
//Если размер массива $content больше 1 , то мы делаем выборку из таблицы Post т.к. это запись, потому что пока нельзя указывать родительскую страницу для другой страницы
else{
$data Post::where('slug''='end($content))->where('visibility''='true)->first();

if(
$data == null)
{
abort(404);
}

//Указываем в какую view уйдут данные
$view 'post';
}

Пока работает нормально, НО когда добавяться категории для товаров, товары сами и не знаю там, подкатегории, бренды для категории это будет разростаться и будут не нужные обращения к бд.

К примеру добавиться модель КАТЕГОРИЯ
И теперь, когда человек будет обращаться на такой урл

test.com/category_1

Размер массива $content будет равен 1, и это может быть или СТРАНИЦА или КАТЕГОРИЯ.
Сначала я обращусь к таблице Page и если не найду там строку с таким slug то обращусь к таблице Category если найду, выдам, если нет выдам 404.

Что можете посоветовать? Как лучше сделать? Что бы URL был красивый и понятный.

Возможно сделать одну таблицу TP и в ней хранить Страницы, Записи, Категории, Товары и сделать там поля, которые есть у каждой модели к примеру name, slug, text и сделать еще одну таблицу TP_options и та хранить уже все поля не общие, но в этому случае будет много NULL у записи к примеру и т.д.

#3 Re: Laravel 5.x » Реализация фильтров для товара через отношения » 06.04.2017 16:40:00

Illia пишет:

Я понимаю вашу логику, построения БД, но смею предположить, что она не верна, ибо нельзя мешать в кучу цвета и размеры. Одна таблица - это одна сущность, и размеры, должны быть в отдельной таблице, а цвета в отдельной. В идеале я бы еще и отделил в отдельную таблицу единицы измерения размеров (см, дюймы и прочие). То есть чтобы в таблице размеров было только число, и создать промежуточную таблицу размеров и единиц измерений.

Если Вы хотите подогнать ответ под этот, тогда нужно чтобы запрос был

Goods::with('Filters.Colors', Filters.Sizes')->find(1);

То есть у Вас должна модель фильтров иметь отношение один ко многим цветам и один ко многим размерам. А модель Goods должна иметь отношение - many to many к фильтрам. Ибо один товар может иметь несколько фильтров, и один фильтр, может относится к нескольким товарам.

Отсюда вытекает, что нужно:
- переименовать связующую таблицу attribute_good на filter_good;
- создать таблицу размеров sizes и ее модель;
- создать таблицу размеров colors и ее модель;

И будет вам такой ответ как в джсоне.


А если нужно будет добавить новый фильтр в админке например, придется делать новую модель? Очень муторно. Не знаете, а нельзя перебрать коллекцию вот ту, что я кидал в виде json в коллекцию которая мне нужна типа цвета: крассный, белый размер:20см 30см?

Просто мне нужно что бы через админ панель легко было добавить новый фильтр и позиции к фильтру.

#4 Re: Laravel 5.x » Реализация фильтров для товара через отношения » 05.04.2017 22:29:50

Illia пишет:

В ларавел можно реализовать.

Нужно создать модель для таблицы Attributes и модель для Filters

в Attributes прописать отношение

    public function filter()
    {
        return $this->hasOne('App\Models\Filter');
    }

В запросе из БД должен присутствовать метод ->with('filter')

тоесть примерно так:

$result = Attribute::where('id', '=', 1)->with('filter')->first();

У меня это есть. Я же прислал ссылочку на json как есть и как нужно что бы было
У меня сейчас реализовано как Goods::with('Attributes.Filters')->find(1); к примеру. И выходит вот так, как показнно по ссылочку json

#5 Laravel 5.x » Реализация фильтров для товара через отношения » 05.04.2017 19:04:22

fenix1996l
Ответов: 4

Здравствуйте. Проблема в реализации фильтров для товара.
Имеются такие таблицы(Возможное вы меня поправите)

Тест BBcode
В таблице filters могут быть поля цвет с id=1, размер  с id=2 и т.д.
В таблице attributes получается сам атрибут например Красный значит filter_id = 1 и т.д.
В таблице attribute_good уже сами атрибуты для каждого товара

Сам вопрос. Как мне группировать аттрибуты в фильтр?
Вот я себе представляю это так http://jsoneditoronline.org/?id=248ea31 … 794213b0e5

Но сейчас я реализовал это, но есть баг. Выводят атрибуты товара а в них уже как в отношениях выводиться таблица с фильтром. Т.е.
У меня 3 цвета и 2 размера значит будет три раза повторятся фильтр цвет и 2 раза фильтр размер. Т.е. у меня сейчас вот так
http://jsoneditoronline.org/?id=46062b2 … 60351e095c

Как думаете можно ли это реализовать через отношения в Ларе? Или лучше написать через билдер?

#6 Re: Laravel 5.x » Фильтры для товаров » 18.01.2017 20:25:35

Dens пишет:

Затрудняюсь ответить вам
Могу только сказать на своём опыте, сколько раз не делал фильтры у меня всегда передавались ID фильтра
Если фильтров изначально ограниченное количество, то в таблице товаров есть поля с id каждого фильтра.
Итого
При добавлении фильтра передаются просто его ID
При применении фильтра так же передаются его ID
Если фильтра в виде чекбоксов то массив ID

<input type="checkbox" name="brand[]" value="brand_id">

Думаю вам стоит передавать ИД и не мучаться


Я там еще ответил вам ввыше, забыл процитировать
Нельзя например никак сделать, типо такого

$goods - Goods::with('filters', 'filters_goods', 'filters_position')->find(240);

И получить результат типо такого
тут инфа о товаре, цена, описание и т.д.
filters =>
0 = >
   id => 1
   name => Цвет
   filter_position =>
     0 =>
         id => 1
         name => красный
    1 =>
         id => 2
         name => черный
1 = >         
   id => 2
   name => Размер
   filter_position =>
     0 =>
         id => 10
         name => 10см

#7 Re: Laravel 5.x » Фильтры для товаров » 18.01.2017 20:13:11

Я так и делаю. Вот смотрите

Вот сами фильтры в админке
asas.png

Чекбосы вот такие
<input type="checkbox" class="flat" name="filter_position[]" value="1" style="position: absolute; opacity: 0;">
где value это ид позиции фильтра, в данном случае это позиция Красный фильтра Цвета, там ниже будет
filters
id  name
1   Цвет
2   Размер

Filters_position
id    Filters_id    name
1    1             красный
2    1             черный
3    2             10см
4    2             15см

Вот что присылает вардамп
asasasas.png

Вот сам код
asassasasadasda.png

Возможно ли сделать это более оптимизирование через отношения? И вот оно как бы работает, да, но теперь при редактировании товара это жесть:)

А сама таблица куда грузится вот
goods.png

Возможно я не так составил таблицу?( Мучаюсь уже 4 дня...

#8 Re: Laravel 5.x » Фильтры для товаров » 18.01.2017 18:48:51

Dens пишет:

Нужно конечно смотреть на код, поэтому могу с ответом не угадать
Будьте внимательны с

$goods = Goods::create(Request::all());

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

А почему бы вам не добавить ещё один запрос для записи в другие таблицы, раз это админка, значит нагрузка будет не высокой, и решение делается в течении минуты

Вы имеете ввиду через for делать инсертами? Насчет полей знаю, я их указал. Но просто понимаете, при отправки позиций фильтров, у меня нет ид самого фильтра. Конечно можно сделать опять таки через for прогнать выборку по таблице filter_position. Просто я думал, что через отношения можно сделать это и будет код проще.

Вот так например я сейчас делаю выборку ИД самого фильтра для каждой позиции, которую я выбрал

$filter_position = Request::input('filter_position');
       $filter_position = array_map(function ($value) { 
        return (int) $value;
          }, $filter_position); 
       $Filter_id = FilterPosition::with('filter')->whereIn('filter_position_id',  $filter_position)->get(['filters_id'])->toArray();

#9 Laravel 5.x » Фильтры для товаров » 18.01.2017 17:46:39

fenix1996l
Ответов: 6

Здравствуйте! Уже облазил весь инет насчет фильтров для товара.


При добавлении товара в админке, есть чекбоксы с фильтрами. Задача в том, что бы при добавлении товара в таблицу Filters_goods записывались значения фильтра, позиции фильтра и сам товар. У меня сложность со связями в ларавеле. filter и filter_position связаны, как один ко многим, а как связать все три таблицы, что бы при create все создавалось в filter_goods ?
Возможно сами таблицы построены не верно:(

Сразу извиняюсь за формулировку вопроса)
Я понимаю как сделать например обычные теги к товару, но вот с фильтрами беда.

Сам товар создаю так
$goods = Goods::create(Request::all());

Как сделать так же только для Filters_goods?
filters
id    name
1    Цвет
2    Размер

Filters_goods
id    goods_id    filters_id    filter_position_id
1    1                1            2             
2    1                1             2

Filters_position
id    Filters_id    name
1    1             красный
2    1             черный
3    2             10см
4    2             15см

Вот вардамп при выборе фильтров
  'filter_position' =>
    array (size=3)
      0 => string '1' (length=1)
      1 => string '2' (length=1)
      2 => string '4' (length=1)

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