我正在尝试在laravel中混合pivot表值

xwbd5t1u  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(314)

我有三个表类别和产品,其透视表为类别产品
一个类别有很多产品
我想在产品属性中的类别名称有自己的字段。

$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);

例如:

ddrv8njm

ddrv8njm1#

可以将自定义属性添加到 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() 或者发送这个 $product 通过json。您将失去此属性。

yebdmbv4

yebdmbv42#

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

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

然后您可以简单地引用类别名称,如下所示:

$product->categoryName

我看到的主要问题是,您在代码中引用“categories”,好像它是复数。如果产品属于多个类别,那么解决方案会有所不同,您的关系将需要一个透视表,正如您所描述的那样。但是,如果产品只是属于一个类别,正如您的代码所暗示的,那么上面的解决方案就足够了,您实际上不需要透视表。您只需要在products表中直接有一个category\u id列。
如果确实希望每个产品有多个类别,可以执行类似的操作,但返回一个数组:

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

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

$product->categoryNames

相关问题