#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. Это именно то, что я искал, большое вам спасибо!