geometria
@geometria

Как вернуть параметр из двух связанных Eloquent моделей?

У меня есть две связанные Eloquent модели таблиц:
колонки таблицы partners: id, email, name
колонки таблицы orders: id, status, client_email, partner_id
<?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');
  }
}


<?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/Http/Resources/Order.php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;

class Order extends JsonResource
{
       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,
    ];
    }
}


не знаю, нужно ли это или нет
но создаю также
app/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,
       ];
    }
}

Возвращаю 'partner_name' в OrderController для последующего использования в Vue
но все данные в таблицы отображаются, кроме 'partner_name'
<?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')->get();
    return OrderResource::collection($orders);
   }
}


покажите мне, пожалуйста, как это сделать правильно
  • Вопрос задан
  • 176 просмотров
Пригласить эксперта
Ответы на вопрос 1
@jazzus
OrderResource
public function toArray($request)
{
    return [
      'id' => $this->id,
      'status' => $this->status,
      'client_email' => $this->client_email,
      'partner' => new PartnerResource($this->partner)
    ];
}

PartnerResource
public function toArray($request)
{
    return [
      'id' => $this->id,
      'name' => $this->name,
    ];
}

скинуть кеш браузера, проверить что данные есть в ордерс+партнер до ресурса
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы