Могу ли я объединить данные сводной таблицы с родительским объектом?

#laravel

#laravel

Вопрос:

У меня есть две модели, Category и Item , которые связаны через сводную таблицу.

В сводной таблице, category_item , есть столбец с именем position . В модели категорий я с нетерпением жду загрузки элементов. Мне интересно, можно ли настроить модель так, чтобы при каждом вызове элемента она автоматически добавляла position свойство к себе.

Так, например, если я запускаю в tinker что-то вроде AppModelsCategory::find(1)->items()->get() и он возвращает эту категорию со связанными с ней элементами, я бы хотел, чтобы каждый из этих элементов также имел свойство Position (которое находится в сводной таблице). Возможно ли это?

Category.php

 <?php

namespace AppModels;

use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentRelationsBelongsTo;
use IlluminateDatabaseEloquentRelationsBelongsToMany;

class Category extends Model
{
    protected $fillable = [
        'name'
    ];

    // automatically eager load items of a category
    protected $with = ['items'];

    // define relationships
    public function items(): BelongsToMany
    {
        return $this
            ->belongsToMany('AppModelsItem')
            ->withPivot('position')
            ->withTimestamps();
    }
}
  

Item.php

 <?php

namespace AppModels;

use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentRelationsBelongsToMany;

class Item extends Model
{
    protected $fillable = [
        'name', 'category_id', 'quantity'
    ];

    // define relationships
    public function categories(): BelongsToMany
    {
        return $this
            ->belongsToMany('AppModelsCategory')
            ->withPivot('position')
            ->withTimestamps();
    }
}

  

Комментарии:

1. Это может быть невозможно при настройке загрузки Laravel. Почему бы вам не использовать join вместо этого? Если вы хотите сохранить отношения laravel, вы можете использовать join вместе с belongsToMany , в противном случае просто объедините три таблицы и укажите список выбора.

2. Извините, я недостаточно знаком с Laravel. Не могли бы вы объяснить это немного подробнее?

3. С другой стороны, поскольку принадлежность многим уже является объединением, указание списка выбора также должно работать, я думаю. Я отправлю ответ, чтобы вы попробовали.

Ответ №1:

Попробуйте:

В вашей модели категории:

 public function items(): BelongsToMany
{
    return $this
        ->belongsToMany('AppModelsItem')
        ->select('items.*', 'category_item.position as position');
}
  

Теперь:

 AppModelsCategory::with('items')->find(1);
  

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

Попробуйте это и дайте мне знать.

Комментарии:

1. Это именно то, что я искал, большое вам спасибо!