zvermafia
@zvermafia
WebDev

Кто нибудь использовал пакет franzose/ClosureTable для Laravel (5.1)?

Использую пакет franzose/ClosureTable (в частности для иерархической категории товаров) для мультиязычного сайта на Laravel 5.1.

Проблема в том что не могу получить категории для определенного языка. Например для $category->getRoots() извлекает все родительские категории, но не для определенного языка.
Хотелось бы сделать так $category->lang()->getRoots(), которое возвращал все родительские категории для определенного языка.

Сам смог реализовать такое (но не работает).
К стандартному миграционному файлу, которое генерируется пакетом franzose/ClosureTable добавил две столбцы:
$table->string('name');
$table->enum('lang', ['ru', 'en'])->default('ru');

А к модели добавил:
public function scopeLang($query)
{
        $lang = \App::getLocale();

        return $query->where('lang', $lang);
}

Но это не помогает, если использовать так $category->lang()->getRoots(), выдает ошибку:
Call to undefined method Franzose\ClosureTable\Extensions\QueryBuilder::getRoots()
а если так $category->getRoots()->lang():
Call to undefined method Franzose\ClosureTable\Extensions\Collection::lang()
Но если на прямую задать условия так $categories->getRoots()->where('lang', 'ru'), тогда работает.

И наконец вопрос как реализовать конструкцию вида $category->lang()->getRoots() и для методов Ancestors, Direct descendants (children), Descendants, Siblings? Чтобы фильтровал данные по определенному языку.

Пробовал сам разобраться через исходника пакета, но ума не хватает куда что писать...
  • Вопрос задан
  • 322 просмотра
Решения вопроса 1
franzose
@franzose
Веб-технолог, музыкант
Здравствуйте! Для подобной логики я бы использовал репозиторий, который передавал бы через интерфейс в контроллер. Например:

EloquentCategoryRepository implements CategoryRepository {

    public function __construct(Category $category)
    {
        $this->category = $category;
    }

    public function getRootsByLang($lang)
    {
        return $this->category->getRoots()->whereLang($lang)->get();
    }
}


То же относится к другим методам.

Если же вы не хотите использовать репозиторий, то вместо scope вам необходимо расширить QueryBuilder собственными методами.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы