Laravel модель не получить отношения в ресурс API - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть 2 таблицы, которые связаны друг с другом 3-й таблицей (где хранятся только идентификаторы), теперь кажется, что я не могу получить свои данные из третьей таблицы в файле ресурсов API

Logi c

  1. Product модель (имеет много штрих-кодов)
  2. Barcode модель (относится к продукту и принадлежит к торговой точке)
  3. Outlet модель (имеет много штрих-коды)
  4. outlet_products стол (магазины barcode_id и outlet_id)

код

Barcode model

class Barcode extends Model
{
    public function product()
    {
        return $this->belongsTo(Product::class);
    }

    public function outlet()
    {
        return $this->belongsTo(Outlet::class, 'outlet_products', 'barcode_id', 'outlet_id');
    }
}

Outlet model

class Outlet extends Model
{
    public function barcodes()
    {
        return $this->hasMany(Barcode::class, 'outlet_products', 'outlet_id', 'barcode_id');
    }
}

BarcodeResource

class BarcodeResource extends JsonResource
{
    public function toArray($request)
    {
        $arrayData = [
            'id' => $this->id,
            'sku' => $this->sku,
            'serial_number' =>  $this->serial_number ? (Int) $this->serial_number : null,
            'price' => (Int) $this->price,
            'discount' => $this->discount ? (Int) $this->discount : null,
            'product' => new ProductsResource($this->whenLoaded('product')),
            'outlet' => new OutletsResource($this->whenLoaded('outlet')),
        ];
        return $arrayData;
    }
}

Сейчас я пытаюсь получить штрих-коды моего продукта и название каждой торговой точки для штрих-кода.

Controller

$products = ProductsResource::collection(Product::orderBy('id', 'desc')->with(['barcodes', 'barcodes.outlet'])->get());

и результат:

one

Любая идея, почему я не могу получить мой штрих-код на выходе?

1 Ответ

0 голосов
/ 23 апреля 2020

Исходя из вашего вопроса и комментария выше:

  • A Product имеет много Barcode, а Barcode принадлежит Product. Они имеют отношение Один ко многим .

  • У Outlet много barcode, а у Barcode много Outlet. Они имеют отношение Многие ко многим .


Вот как установить отношение Один ко многим.

В вашем Product классе:

class Product extends Model
{
    public function barcodes()
    {
        return $this->hasMany('App\Barcode');
    }
}

В вашем Barcode классе установите обратную зависимость:

class Barcode extends Model
{
    public function product()
    {
        return $this->belongsTo('App\Product');
    }
}

Вот как установить множество Отношение ко многим.

В вашем Outlet классе:

class Outlet extends Model
{
    public function barcodes()
    {
        return $this->belongsToMany('App\Barcode');
    }
}

В вашем Barcode классе:

class Barcode extends Model
{
    public function outlets()
    {
        return $this->belongsToMany('App\Outlet');
    }
}

Со многими ко многим отношения, вам также нужно создать промежуточную таблицу.

В этом случае ваша сводная таблица будет barcode_outlet.

Важно: Согласно соглашению Laravel, имя промежуточной таблицы должно быть в единственном числе и в алфавитном порядке названий связанных моделей (barcode_outlet в вашем случае).

Промежуточная таблица должна содержать столбцы barcode_id и outlet_id. Я позволю вам соответствующим образом изменить ваши миграции.


После установки отношений вы сможете использовать Eloquent для извлечения ваших моделей.

Пример:

$barcode->outlets;
// returns a Collection of outlets

$barecode->product;
// returns a Product

$product->barcodes;
// returns a Collection of barcodes

$outlet->barcodes;
// returns a Collection of barcodes

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