mafortis
mafortis

Reputation: 7128

Laravel resource return empty array

I have resource where i get product data trough third table but having hard time make relationships work on models so it return empty array.

Logic

  1. Product has many barcodes
  2. Barcodes can have (belongsTo) damage
  3. In damage we get product trough barcode table (we store barcode_id)

I also included fillable part of each column so you can see columns in database.

Code

Product model

class Product extends Model
{

    protected $fillable = [
        'name', 'slug', 'stock', 'cover', 'description', 'sku', 'price', 'discount',
    ];

    public function barcodes()
    {
        return $this->hasMany(Barcode::class);
    }
}

Barcode model

class Barcode extends Model
{
    protected $fillable = [
        'product_id', 'sku', 'serial_number', 'price', 'discount',
    ];

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

    public function damages()
    {
        return $this->hasMany(DamageProduct::class);
    }
}

DamageProduct model

class DamageProduct extends Model
{
    protected $fillable = [
        'outlet_id', 'user_id', 'barcode_id', 'description',
    ];

    public function barcode()
    {
        return $this->belongsTo(Barcode::class);
    }

    public function user()
    {
        return $this->belongsTo(User::class, 'user_id', 'id');
    }
}

DamageProductsResource resource

class DamageProductsResource extends JsonResource
{
    public function toArray($request)
    {
        $arrayData = [
            'id' => $this->id,
            'outlet' => new OutletsResource($this->whenLoaded('outlet')),
            'user' => new usersResource($this->whenLoaded('user')),
            'barcode' => new BarcodeResource($this->whenLoaded('barcode')),
            'description' => $this->description,
        ];

        return $arrayData;
    }
}

Result

one

Any idea?

Update

In case you need to see how BarcodeResource resource looks like here it is:

public function toArray($request)
{
        $arrayNull = [
            'id' => $this->id,
            'product' => new ProductsResource($this->whenLoaded('product')),
            'sku' => $this->sku,
            'serial_number' =>  $this->serial_number ? (Int) $this->serial_number : null,
            'price' => (Int) $this->price,
            'discount' => $this->discount ? (Int) $this->discount : null,
        ];
}

Upvotes: 0

Views: 3298

Answers (1)

Edwin Krause
Edwin Krause

Reputation: 1806

I would say you simply forgot the return statement in your BarcodeResource

public function toArray($request)
{
    $arrayNull = [
        'id' => $this->id,
        'product' => new ProductsResource($this->whenLoaded('product')),
        'sku' => $this->sku,
        'serial_number' =>  $this->serial_number ? (Int) $this->serial_number : null,
        'price' => (Int) $this->price,
        'discount' => $this->discount ? (Int) $this->discount : null,
    ];
    return $arrayNull; // this is missing
}

Upvotes: 2

Related Questions