получить данные из промежуточной таблицы в laravel - PullRequest
0 голосов
/ 03 мая 2020

У меня есть 2 модели (SaleInvoice и Product) со многими ко многим

в модели SaleInvoice:

public function products()
    {
        return $this->belongsToMany(Product::class, 'sale_invoice_product', 'saleInvoice_id', 'product_id')->withPivot('count');
    }

в модели продукта:

    public function saleInvoices()
    {
        return $this->belongsToMany(SaleInvoice::class, 'sale_invoice_product', 'product_id', 'saleInvoice_id');
    }

this пример данных, записанных в таблице sale_invoice_product (промежуточная таблица)

id | saleInvoiceId | product_id | count
1  |      1500     |      1     | 3
2  |      1500     |      3     | 2
3  |      1500     |      4     | 4
4  |      1501     |      1     | 1
5  |      1501     |      4     | 1

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

product_id | product_name | count | saleInvoice | date
     1             LG         3        1500        2020-05-12
     3             SONY       2        1500        2020-05-13
     4             OT         4        1500        2020-05-17
     1             LG         1        1501        2020-05-19
     4             OT         1        1501        2020-05-22

Я хочу вернуть json файл в SaleInvoiceController с верхним форматом

Ответы [ 2 ]

1 голос
/ 03 мая 2020

Вы можете попробовать один из этих методов

  • Построение модели для таблицы sale_invoice_product с отношениями к SaleInvoice и Product. Затем вручную создайте JSON в вашем контроллере
  • Создайте SQL Представление и модель для него

Решение 1: Построение модели для промежуточной таблицы и построение вручную JSON

Допустим, вы создали модель с именем SaleInvoiceProduct, которая имеет отношение product() к таблице Products и отношение saleInvoice() к таблице SaleInvoices. В вашем контроллере вы можете сделать это

$resultInvoiceProducts = [];
$allSaleInvoiceProducts = SaleInvoiceProduct::all();
foreach ($allSaleInvoiceProducts as oneSaleInvoiceProduct) {
     $tempSaleInvoiceProduct = new stdClass();
     $tempSaleInvoiceProduct->product_id = oneSaleInvoiceProduct->product_id;
     $tempSaleInvoiceProduct->product_name = oneSaleInvoiceProduct->product->name;
     $tempSaleInvoiceProduct->saleInvoiceId = oneSaleInvoiceProduct->saleInvoiceId;
     $tempSaleInvoiceProduct->data = oneSaleInvoiceProduct->saleInvoice->date;
     array_push($resultInvoiceProducts, $tempSaleInvoiceProduct);
}

Решение 2: Использование SQL Представления

Вы можете создать SQL Представление, которое использует соединения для построения необходимых вам данных

   DROP VIEW IF EXISTS vSaleInvoiceProduct;
   CREATE VIEW vSaleInvoiceProduct AS
   SELECT sp.product_id,
          sp.saleInvoiceId,
          sp.`count`,
          p.product_name,
          s.`date`
   FROM SaleInvoiceProduct sp
   LEFT JOIN SaleInvoices s on sp.saleInvoiceId = s.saleInvoiceId
   LEFT JOIN Products p on sp.product_id = p.product_id

Затем вы можете создать Laravel модель для этого представления, так же, как вы делали бы это для любой таблицы, вызвать для нее метод ::all() и напрямую вернуть результаты с помощью json()

1 голос
/ 03 мая 2020

Ваша работа была хорошей. Достаточно сделать ресурс API для этой модели и отправить атрибуты, как вы хотите. Для доступа к сводной таблице вы можете использовать $product->pivot->count.

...