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

У меня есть две связанные модели таблиц Eloquent:

# app/Order.php

protected $fillable = [
  'id',  'status', 'client_email', 'partner_id',
];

public function partner()
{
    return $this->belongsTo('App\Partner');
}
# app/Partner.php

protected $fillable = ['id', 'email', 'name'];

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

Затем, если я пытаюсь добавить $partner к массиву в моем Order ресурсе, я получаю ошибку сервера:

# app/Http/Resources/Order.php

public function toArray($request)
{
   // $partner = Order::find(1)->partner;

    return parent::toArray($request);

    return [
      'id' => $this->id,
      'status' => $this->status,
      'client_email' => $this->client_email,
      'partner_id' => $this->partner->id,
      'partner_name' => $this->partner->name,
     ];
}

создано дополнительно, но я не знаю, нужно ли мне это или нет приложение / Http / Resources / Partner. php

<?php

namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;

class Partner extends JsonResource
{
    public function toArray($request)
    {
        return parent::toArray($request);

        return [
          'id' => $this->id,
          'name' => $this->name,
       ];
    }
}

Как мне вернуть 'имя_партнера' в OrderController для последующего использования в Vue?

# OrderController.php

use App\Http\Resources\Order as OrderResource;

class OrderController extends Controller
{

    public function index()
    {
        $orders = Order::with('partner')->get();

        return OrderResource::collection($orders);
    }
}

Столбцы партнеров таблицы:

id, email, name

Столбцы заказов таблицы:

id, status, client_email, partner_id

Правильно ли пройти 'partner_name' в массиве Resources / Order. php или это нужно сделать в контроллере?

Пожалуйста, покажите мне, как это сделать правильно

Ответы [ 3 ]

2 голосов
/ 12 февраля 2020

Кажется, что ваши отношения немного нарушены.

Из ваших значений $fillable в модели Order я вижу partner_id, так что - поправьте меня, если я ошибаюсь, но - это внешний ключ ... делая эту модель дочерней one.

Попробуйте обновить ваши отношения следующим образом:

# Order.php

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

И:

# Partner.php

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

Итак, теперь вы можете сделать так, чтобы ваши отношения работали так же в вашем Order resource:

<?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,   // <---
        ];

    }
}

В качестве идентификатора, учитывая тот факт, что вы хотите использовать этот ресурс для возврата нескольких моделей, когда ресурс попытается получить доступ к значению отношения, он сделает дополнительный запрос .. знаменитая N + 1 задача . Чтобы избежать этого, просто стремитесь загрузить отношения в свой контроллер:

use App\Http\Resources\Order as OrderResource;

public function index()
{
    $orders = Order::with('partner')->get();
    //               ^^^^^^^^^^^^^^^^^^^^^^^
    return OrderResource::collection($orders);
}
0 голосов
/ 12 февраля 2020

используйте это отношение

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

class Order extends JsonResource
{
       public function toArray($request)
    {
       //return sever error
       //$partner = Order::find(1)->partner;

        return parent::toArray($request);
return [
      'id' => $this->id,
      'status' => $this->status,
      'client_email' => $this->client_email,
      'partner_id' => $this->partner->partner_id,
      'partner_name' => $this->partner->partner,
    ];

}
}
0 голосов
/ 12 февраля 2020

Доступ к partner атрибутам с использованием отношения из вашей модели в ресурсе:

return [
    'id' => $this->id,
    'status' => $this->status,
    'client_email' => $this->client_email,
    'partner_id' => $this->partner->id,       // <-- here
    'partner_name' => $this->partner->name,   // <-- here
];

РЕДАКТИРОВАНИЕ:

В вашем контроллере передайте именно те данные, которые вы хотите использовать / преобразовать , В вашем случае вы передаете коллекцию User. Вы также должны передать любые отношения, на которые вы полагаетесь.

return App\OrderResource::collection(Order::with('partner')->get());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...