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

Кемеровские программисты php общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Как настроить связь HasManyThrough с внешними ключами только в промежуточной таблице?

Сообщение Anonymous »

Я работаю над проектом, использующим Laravel v9.19 и PHP 8.0.
Вот часть базы данных этого проекта, которая имеет отношение к вопросу:
Изображение
  • У одного пользователя может быть много заказов, но у каждого заказа есть только один пользователь (отношение «один ко многим»).
  • В одном заказе может быть только один товар, но один товар может присутствовать во многих заказы (отношения «многие к одному»).
Вот класс Пользователь:

Код: Выделить всё

class User extends Authenticatable
{
// ...

/**
* Get orders of this user.
*
* @return Illuminate\Database\Eloquent\Relations\HasMany
*/
public function orders(): HasMany
{
return $this->hasMany(Order::class, 'client_id');
}
}
Вот класс Order:

Код: Выделить всё

class Order extends Model
{
// ...

/**
* Get the client of this order.
*
* @return Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function client(): BelongsTo
{
return $this->belongsTo(User::class, 'client_id');
}

/**
* Get the ordered item.
*
* @return Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function item(): BelongsTo
{
return $this->belongsTo(Item::class, 'item_id');
}
}
Вот класс Item:

Код: Выделить всё

class Downloadable extends Model
{
// ...

/**
* Get the orders having this item.
*
* @return Illuminate\Database\Eloquent\Relations\HasMany
*/
public function orders(): HasMany
{
return $this->hasMany(Order::class, 'item_id');
}
}
Я хотел бы использовать Eloquent Relationships, чтобы сделать возможным:
  • Получать все элементы, упорядоченные по конкретного пользователя.
  • Получить всех пользователей, которые заказали определенный товар.
Мне нужно будет добавить нового метод для модели Пользователь:

Код: Выделить всё

    /**
* Get items ordered by this user.
*
* @return ???
*/
public function items()
{
// What to do here?
}
Мне нужно будет добавить новый метод в модель Item:

Код: Выделить всё

    /**
* Get users that ordered this item.
*
* @return ???
*/
public function users()
{
// What to do here?
}
Поскольку для связи HasManyThrough по умолчанию требуется другая структура таблицы, и я не могу изменить существующую структуру таблицы, она здесь неприменима.
Как один из возможные решения Я рассматриваю возможность использования staudenmeir/eloquent-has-many-deep, создания новой промежуточной таблицы с именем order_item для сопоставления заказов с элементами и использования следующего кода, например, для items метод:

Код: Выделить всё

    /**
* Get items ordered by this user.
*
* @return ???
*/
public function items()
{
return $this->hasManyDeep(
Item::class,
[Order::class, 'order_item']
);
}
Если существует решение Laravel без внешних библиотек или вы знаете что-то более эффективное, поделитесь этим со мной. Мне очень хотелось бы узнать, как лучше всего действовать в этом случае.

Подробнее здесь: https://stackoverflow.com/questions/790 ... e-intermed
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Php»