我有三个表类别和产品,其数据透视表为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);
例如:
答案 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
时。您将失去此属性。