Я пытаюсь смешать значения сводной таблицы в Laravel - PullRequest
0 голосов
/ 09 октября 2018

У меня есть три таблицы категорий и товаров с его сводной таблицей как category_product

В одной категории много продуктов

Мне нужно имя категории в атрибутах товаров с собственным полем.

    $saijal = "Our Products";
    $products = Product::orderBy('created_at','DESC')->with('categories')->get();

    $abc = new Collection();
    foreach($products as $pro)
    {
        $abc->put($pro->id,$pro);
    }

    foreach($products as $k => $pro)
    {
        $abc->get($pro->id)->children = new Collection();
        $abc->get($pro->id)->categoryName= $pro->categories->name;

        $abc->get($pro->id)->children->push($pro);
        unset($pro[$k]);

    }
    dd($abc);

Например:

enter image description here

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Вы можете добавить пользовательские атрибуты в appends массив (не attributes массив) .

class Product extends Model
{

    protected $appends = ['category_names'];

    public function getCategoryNamesAttribute()
    {
        return $this->categories->map->name;
    }
}

Вы можете получить доступ к этому атрибуту как,

$product->category_names;

Примечание

Преимущество добавления этого в массив appends.Если вы не добавите это в массив добавления, когда вы вызываете toArray() или toJson() или отправляете это $product через json.Вы теряете этот атрибут.

0 голосов
/ 09 октября 2018

Если я правильно понимаю, вы хотите иметь доступ к атрибуту с именем "categoryName" непосредственно из объекта продукта.Для этого просто установите средство получения атрибутов в модели Product.php, которое выглядит следующим образом:

public function getCategoryNameAttribute()
{
    return $this->category->name;
}

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

$product->categoryName

Основная проблема, которую я вижу, заключается в том, что вы ссылаетесь на «категории» в своем коде, как если бы он был множественным.Если продукт относится ко многим категориям, решение будет другим, и ваши отношения потребуют сводной таблицы, как вы описываете.Но если продукт относится только к одной категории, как подразумевает ваш код, приведенного выше решения должно быть достаточно, и вам фактически не нужна сводная таблица.Вы бы просто имели столбец category_id прямо в таблице продуктов.

Если вы хотите иметь несколько категорий для каждого продукта, вы можете сделать что-то подобное, но вернуть массив:

public function getCategoryNamesAttribute()
{
    return $this->categories->pluck('name');
}

Это вернет массив имен категорий, связанных с этим продуктом, и будет доступен как:

$product->categoryNames
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...