Search code examples
laravellaravel-5laravel-5.3

How to join output of models in Laravel?


I have the following code:

$orders = OrderProduct::where(function ($query) use ($request) {

})->with('order_products')->orderBy('status', 'desc')->paginate(50)->toArray();

And order_products function is:

 public function order_products()
    {
        return $this->hasMany("App\Order", "order_id", "order_id");
    }

It gives me output result:

{
        "user_id": "1",
        "created_at": "2016-12-18 14:06:11",
        "status": "2",
        "note": "34535345",
        "order_id": "2",
        "address": "Kiev",
        "courier_id": null,
        "payment_type": "0",
        "order_products": [
          {
            "id": 73,
            "product_id": "1265",
            "amount": "1"
          },
          {
            "id": 74,
            "product_id": "1266",
            "amount": "1"
          }
        ]

I need to join order_products with products_details, that to give title of product for each order like as:

"order_products": [
              {
                "id": 73,
                "product_id": "1265",
                "amount": "1",
                "title": "Product name"
              },
              {
                "id": 74,
                "product_id": "1266",
                "amount": "1",
                "title": "Product name"
              }
            ]

Instead this I get a new model output in response:

"products_details": [
  {}, {}
]

How can I join two with models?


Solution

  • without joining, just using your first code:

    in order_products, override the toArray() method.

    function toArray() {
      return [
        id         => $this->id,
        product_id => $this->product_id,
        amount     => $this->amount,
        title      => $this->details->name
      ];
    }
    

    wich $this->details->name is the relation between order_products and products_details