как показать эти данные отношения ко многим в иерархическом порядке в laravel? - PullRequest
0 голосов
/ 10 ноября 2019

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

Need to show this every 1 to many related data on a hierarchical order on 
a single view page. I want to loop through these array and 
want my result like tree view:

1 Ответ

0 голосов
/ 11 ноября 2019

На основании предоставленной вами информации я постараюсь максимально вам помочь.

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

При этом у вас еще есть 2 варианта для этого. Отношение один ко многим или много ко многим между вашим ингредиентом и категорией. Это зависит от того, что вы хотите, хотите ли вы, чтобы ингредиент имел одну или несколько категорий. Я добавил изображение ниже, чтобы показать 2 типа структур базы данных для этого. (Слева: один ко многим, Справа: много ко многим)

enter image description here

Вам нужно будет создать 2 модели как для категории, так и для ингредиента и сделатьубедитесь, что вы можете использовать эти модели для хранения и получения данных из вашей базы данных. Если вам нужна дополнительная информация о моделях, посмотрите здесь: https://laravel.com/docs/6.x/eloquent#defining-models

После создания ваших моделей вы должны определить свои методы отношений внутри своих моделей. Это отличается в зависимости от выбора, который вы сделали. (много ко многим или один ко многим).

Один ко многим:

В примере «один ко многим» ингредиент может иметь только 1 категорию. Для этого вам нужно создать метод в вашем ингредиенте под названием category, и он должен вернуть HasOne:

    /**
     * @return HasOne
     */
    public function category(): HasOne
    {
        return $this->hasOne(Category::class);
    }

Тогда в вашей категории может быть несколько Ingredients, поэтому ваша категория должна получить метод с именем ингридиентов, и она должна вернуть BelongsToMany:

    /**
     * @return BelongsToMany
     */
    public function ingredients(): BelongsToMany
    {
        return $this->belongsToMany(Ingredient::class);
    }

Многие ко многим:

В отношении многих ко многим ваша категория будет такой же, потому что она все еще имеет много ингредиентов. Изменится только ингредиент, потому что он не имеет много категорий. Метод для категорий теперь будет таким же, как и для ингредиентов:

    /**
     * @return BelongsToMany
     */
    public function categories(): BelongsToMany
    {
        return $this->belongsToMany(Category::class);
    }

Вот так! Теперь, как это использовать (и, надеюсь, ответ на ваш вопрос). Если у вас есть такая категория, как:

$category = Category::first();

Вы можете использовать метод ингредиентов, чтобы получить все ингредиенты, имеющие эту категорию:

$category = Category::first();
$ingredients = $category->ingredients;

Это даст вам коллекцию со всемиингредиенты этой категории.

Вы также можете использовать это для каждой категории.

$categories = Category::all(); //Get all categories
foreach ($categories as $category) {
    $ingredients = $category->ingredients; //Get all ingredients
}

Дополнительно:

Обратите внимание, что я не использую () после ингредиентов, это связано с выполняемыми запросами mysql (Без () он будет проверять, есть ли у него результаты (если да, он будет использовать их или нет, он будет запрашивать вашу базу данных, а затем использовать результаты)).

...