Laravel - как настроить отношение загрузки промежуточной таблицы - PullRequest
0 голосов
/ 23 октября 2019

У меня есть три модели, SalesReturn, Product и ProductSalesReturn, и их отношения следующие:

class SalesReturn extends Model
{
    public function products()
    {
        return $this->belongsToMany(Product::class)
            ->withTimestamps()
            ->using(ProductSalesReturn::class);
    }
}

Я использую ProductSalesReturn для представления промежуточной таблицы (https://laravel.com/docs/6.x/eloquent-relationships#defining-custom-intermediate-table-models), иProductSalesReturn имеет отношение к Unit:

class ProductSalesReturn extends Pivot
{
    public function unit()
    {
        return $this->belongsTo(Unit::class);
    }
}

Когда я жду загрузки отношения unit, например, следующего кода:

SalesReturn::with(['products', 'products.unit'])->find($id);

Я получу следующую ошибку:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'units.product_id' in 'where clause' (SQL: select * from `units` where `units`.`product_id` in (1031, 1631, 13391, 14361, 16981, 17441, 41982, 45982, 55741) and `units`.`deleted_at` is null)

Схемы таблиц следующие:

CREATE TABLE `sales_returns` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `number` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL,
  `user_id` bigint(20) NOT NULL,
  `order_id` bigint(20) NOT NULL,
  `note` text COLLATE utf8mb4_unicode_ci NOT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE `product_sales_return` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `sales_return_id` bigint(20) NOT NULL,
  `product_id` bigint(20) NOT NULL,
  `unit_id` bigint(20) NOT NULL,
  `price` double NOT NULL,
  `amount` int(11) NOT NULL,
  `gross_profit` double NOT NULL DEFAULT '0',
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

Как я могу загружать отношение пользовательской промежуточной таблицы в Laravel?

Спасибо.

1 Ответ

0 голосов
/ 23 октября 2019

Вы можете использовать Laravel Eloquent: отношения стремящейся нагрузки

Установка

composer require ajcastro/eager-load-pivot-relations

Конфигурация

use AjCastro\EagerLoadPivotRelations\EagerLoadPivotTrait;
class Product extends Model
{
    // Use the trait here to override eloquent builder.
    // It is used in this model because it is the relation model defined in
    // SalesReturn::products() relation.
    use EagerLoadPivotTrait;
}

Использование

return SalesReturn::with('products.pivot.unit')->get();

Определите параметры table, foreignPivotKey и relatedPivotKey в отношениях produtcts belongsToMany

...