Как правильно взаимодействовать с четырьмя моделями Eloquent? - PullRequest
0 голосов
/ 15 февраля 2020

Проект состоит из четырех связанных таблиц:

  1. заказов (id, status, client_email, partner_id)
  2. order_products (id, order_id, product_id, количество, цена)
  3. партнеров (id, email, name)
  4. prods (id, name, price, vendor_id)

создание 4 моделей:

    <?php
    //App\Order.php
    namespace App;
    use Illuminate\Database\Eloquent\Model;

    class Order extends Model
    {
        protected $fillable = [
      'id',  'status', 'client_email', 'partner_id',
    ];

public function partner()
  {
    return $this->belongsTo('App\Partner');
  }

public function order_product()
  {
//belongsToMany - server error
    return $this->belongsTo('App\Prod', 'order_products');
  }

public function prod()
  {
    return $this->belongsTo('App\Prod');
  }

    }

<?php
//App\Partner.php
namespace App;
use Illuminate\Database\Eloquent\Model;

class Partner extends Model
{
   protected $fillable = ['id', 'email', 'name'];

public function order()
  {
    return $this->hasOne('App\Order');
  }

}

    <?php
    //App\Order_product.php
    namespace App;
    use Illuminate\Database\Eloquent\Model;

    class Order_product extends Model
    {
        protected $fillable = ['order_id', 'product_id', 'quantity', 'price'];

 public function order()
  {
    return $this->hasOne('App\Order');
  }

    }

    <?php
    //App\Prod.php
    namespace App;
    use Illuminate\Database\Eloquent\Model;

    class Prod extends Model
    {
        protected $fillable = ['order_id', 'product_id', 'quantity', 'price'];

    public function order()
  {
    return $this->belongsToMany('App\Order', 'order_products');
  }

    }

создание ресурсов заказов:

<?php
//App\Http\Resources\Order.php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;

class Order extends JsonResource
{
    public function toArray($request)
{
    return [
        'id'           => $this->id,
        'status'       => $this->status,
        'client_email' => $this->client_email,
        'partner_id'   => $this->partner_id,
        'partner_name' => $this->partner->name,

        //return server error
        'product_id'   => Prod::collection($this->order_product), 
        'name'         => $this->prod->name,

    ];

}

}

создание ресурсов производства:

<?php
//App/Http/Resources\Prode.php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;

class Prod extends JsonResource
{
    public function toArray($request)
    {
        return [
            'id'      => $this->id,
            'name'    => $this->name,
            'price'   => $this->price,
        ];
    }
}

и возврат из контроллера заказов:

<?php
//App\Http\Controllers\Api\OrderController.php
namespace App\Http\Controllers\Api;

use App\Order;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Http\Resources\Order as OrderResource;

class OrderController extends Controller
{
public function index()
  {
    $orders = Order::with(['partner', 'order_product', 'prod'])->get();
    return OrderResource::collection($orders);
   }
}

Как получить название товара в заказе?

1 Ответ

1 голос
/ 15 февраля 2020

Order_product похоже на название сводной таблицы. Это не обязательно в laravel, потому что рамки по умолчанию принимают структуру таблицы. Рекомендуемый подход заключается в создании следующих моделей:

  • Заказ
namespace App;
use Illuminate\Database\Eloquent\Model;

class Order extends Model
{
    protected $fillable = [
        'id',  'status', 'client_email', 'partner_id',
    ];

    public function partner()
    {
        return $this->belongsTo('App\Partner');
    }

    public function products()
    {
        return $this->belongsToMany('App\Product', 'order_products');
    }

    public function prod()
    {
        return $this->belongsTo('App\Prod');
    }
}
  • Product (Prod)
namespace App;
use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    protected $table = 'prod';
    protected $fillable = ['order_id', 'product_id', 'quantity', 'price'];

    public function orders()
    {
        return $this->belongsToMany('App\Order', 'order_products');
    }
}

и со следующими ресурсами:

OrderResource

<?php
//App\Http\Resources\Order.php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;

class OrderResource extends JsonResource
{
    public function toArray($request)
    {
        return [
            'id'           => $this->id,
            'status'       => $this->status,
            'partner_id'   => $this->partner_id,
            'partner_name' => $this->partner->name,
           'products'    =>  ProductResource::collection($this->products), 
           'name'          => $this->prod->name,
        ];

    }
}

ProductResource

<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;

class ProductResource extends JsonResource
{
    public function toArray($request)
    {
        return [
            'id'           => $this->id,
            'name'       => $this->name,
            'price'   => $this->price,
        ];

    }
}

подробнее по Отношения ко многим можно найти в документах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...