Laravel模型无法在资源API中获取关系。

问题描述 投票:0回答:1

我有2个表,通过第3个表(只存储ID)相互关联,现在似乎我不能从API资源文件中的第3个表中获取数据。

逻辑学

  1. Product 型号
  2. Barcode 款式(属于产品,属于网点)
  3. Outlet 模型
  4. outlet_products 桌子 barcode_idoutlet_id)

编码

Barcode model

class Barcode extends Model
{
    public function product()
    {
        return $this->belongsTo(Product::class);
    }

    public function outlet()
    {
        return $this->belongsTo(Outlet::class, 'outlet_products', 'barcode_id', 'outlet_id');
    }
}

Outlet model

class Outlet extends Model
{
    public function barcodes()
    {
        return $this->hasMany(Barcode::class, 'outlet_products', 'outlet_id', 'barcode_id');
    }
}

BarcodeResource

class BarcodeResource extends JsonResource
{
    public function toArray($request)
    {
        $arrayData = [
            'id' => $this->id,
            'sku' => $this->sku,
            'serial_number' =>  $this->serial_number ? (Int) $this->serial_number : null,
            'price' => (Int) $this->price,
            'discount' => $this->discount ? (Int) $this->discount : null,
            'product' => new ProductsResource($this->whenLoaded('product')),
            'outlet' => new OutletsResource($this->whenLoaded('outlet')),
        ];
        return $arrayData;
    }
}

现在我想得到我的产品条码和每个条码网点的名称。

Controller

$products = ProductsResource::collection(Product::orderBy('id', 'desc')->with(['barcodes', 'barcodes.outlet'])->get());

而结果是。

one

任何想法,为什么我不能得到我的条码出口?

php laravel
1个回答
0
投票

根据你的问题和上面的评论。

  • A Product 有很多 Barcode 和a Barcode 属于 Product. 他们有一个 一对多 的关系。

  • 一个 Outlet 有很多 barcode 和a Barcode 有很多 Outlet. 他们有一个 很多很多 的关系。


下面是如何设置 "一对多 "关系。

在你的 Product 类。

class Product extends Model
{
    public function barcodes()
    {
        return $this->hasMany('App\Barcode');
    }
}

在你的 Barcode 类,设置逆向关系。

class Barcode extends Model
{
    public function product()
    {
        return $this->belongsTo('App\Product');
    }
}

下面是如何设置 "多对多 "关系。

在你的 Outlet 类。

class Outlet extends Model
{
    public function barcodes()
    {
        return $this->belongsToMany('App\Barcode');
    }
}

在你的 Barcode 类。

class Barcode extends Model
{
    public function outlets()
    {
        return $this->belongsToMany('App\Outlet');
    }
}

有了多对多的关系,你还需要创建一个中间表。

在这种情况下,你的数据透视表将是 barcode_outlet.

重要的是: 根据Laravel的惯例, 中间表的名称必须是单数形式, 并按相关模型名称的字母顺序排列 (在你的例子中是barcode_outlet).

中间表必须有 barcode_idoutlet_id 列。我会让你相应的修改你的迁移。


设置好关系后,你就可以使用Eloquent来检索你的模型了。

举个例子。

$barcode->outlets;
// returns a Collection of outlets

$barecode->product;
// returns a Product

$product->barcodes;
// returns a Collection of barcodes

$outlet->barcodes;
// returns a Collection of barcodes

© www.soinside.com 2019 - 2024. All rights reserved.