Почему hasOneThrough отображает недопустимые данные? - PullRequest
1 голос
/ 11 марта 2020

В этом примере я получаю действительный массив, но с вложенным массивом, который имеет несоответствия

{ "order_id": 1, "status": 20, 
"product_id": [ 
{ "id": 1, "order_id": 1, "product_id": 8, "quantity": 1, "price": 141 }, 
{ "id": 2, "order_id": 1, "product_id": 30, "quantity": 2, "price": 509 }, 
{ "id": 3, "order_id": 1, "product_id": 21, "quantity": 1, "price": 399 } ], 
"name": { "id": 1, "name": "Product_1", ... "laravel_through_key": 1 }

, поскольку в первом порядке есть три продукта, во втором порядке я уже получаю «имя» : "Product_4", т. Е. Интервал правильный, и порядок указан в таблице заказов, а не в таблице order_products:

{ "order_id": 2, "status": 10, 
"product_id": [ 
{ "id": 4, "order_id": 2, "product_id": 1, "quantity": 3, "price": 320 }, 
{ "id": 5, "order_id": 2, "product_id": 11, "quantity": 2, "price": 953 }, 
{ "id": 6, "order_id": 2, "product_id": 20, "quantity": 1, "price": 911 } ], 
"name": { "id": 4, "name": "Product_4", ... "laravel_through_key": 2 }

Как сделать так, чтобы названия продуктов соответствовали product_id в order_products?

вот моя табличная диаграмма:

orders
id - integer
status - integer

order_products
id - integer
order_id - integer
product_id - integer
quantity - integer
price - integer

prods
id - integer
name - string

модель заказа

class Order extends Model
{
public function order_product()
  {
return $this->hasMany('App\Order_product');
   }

public function prod()
  {
return $this->hasOneThrough('App\Prod', 'App\Order_product', 'order_id', 'id', 'id' );
  }

модель Prod

class Prod extends Model
{
public function order()
  {
    return $this->hasMany('App\Order', 'order_products');
  }

модель Order_product
class Order_product extends Model
{
    protected $fillable = ['order_id', 'product_id', 'quantity', 'price'];
}

Порядок ресурсов

class Order extends JsonResource
{
    public function toArray($request)
    {
        return [
            'order_id'     => $this->id,
            'status'       => $this->status,
            'product_id'   => $this->order_product,
            'name'         => $this->prod,
          ];
    }

Порядок контроллеров

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

1 Ответ

1 голос
/ 11 марта 2020

Согласно вашему дизайну БД, между заказом и продуктом должно быть belongsToMany.

Модель заказа

public function products()
{
    return $this->belongsToMany('App\Prod', 'Order_product', 'order_id','product_id');
}

Модель продукта

public function orders()
{
    return $this->belongsToMany('App\Order', 'Order_product','product_id', 'order_id');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...