我正在尝试在Laravel中混合数据透视表的值

时间:2018-10-09 03:23:04

标签: php mysql database laravel eloquent

我有三个表类别和产品,其数据透视表为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 :(得分:1)

如果我正确理解,您希望能够直接从产品对象访问名为“ categoryName”的属性。为此,只需在Product.php模型中设置如下所示的属性getter:

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

然后,您可以像这样简单地引用类别名称:

$product->categoryName

我看到的主要问题是您在代码中所指的“类别”就好像是复数形式。如果产品属于多个类别,则解决方案将有所不同,并且您的关系将需要您描述的数据透视表。但是,正如您的代码所暗示的,如果该产品仅属于一个类别,则上面的解决方案应该足够了,您实际上不需要数据透视表。您只需要在产品表中直接创建一个category_id列即可。

如果您确实希望每个产品具有多个类别,则可以执行类似的操作,但返回一个数组:

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

这将返回与此产品相关联的类别名称数组,并且可以通过以下方式访问:

$product->categoryNames

答案 1 :(得分:0)

您可以将自定义属性添加到appends数组(不是attributes数组)

class Product extends Model
{

    protected $appends = ['category_names'];

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

您可以按以下方式访问此属性,

$product->category_names;

注意

将其添加到appends数组的好处是。如果不将其添加到appends数组,则在调用toArray()toJson()或通过json发送此$product时。您将失去此属性。