WedX - журнал о программировании и компьютерных науках

Laravel Accessor или HasManyThrough или что-то еще?

У меня четыре модели: User, Product, Order, OrderItem

Когда User добавляет товар в свою корзину, создается новый Order, а товар становится новым OrderItem.

Столы:

users
    id - integer
    name - string

products
    id - integer
    name - string

orders
    id - integer
    user_id - integer
    paid - boolean

order_items
    order_id - integer
    product_id - integer
    quantity -integer
    price - double

Отношения:

`Product` hasMany `OrderItem`
`OrderItem` belongsTo `Order`
`OrderItem` belongsTo `Product`
`Order` hasMany `OrderItem`
`User` hasMany `Order`

Я хочу иметь возможность перечислить все Product и под каждым всех User, купивших этот Product (Order whereNotNull 'paid'). И наоборот, я хотел бы показать User все Product, которые они купили.

Я пробовал делать это поэтапно с отношениями. Я могу заставить {{ $product->orderItems }} работать, но не {{ $product->orderItems->orders }}

Laravel не разрешает отношения hasManyThrough со сводной таблицей, что, по сути, и есть order_items, так что это не сработает.

Возможно, я мог бы сделать это с помощью Accessor с соединением, но я не могу понять это, потому что я не могу установить отношения.

Может быть, пользовательская коллекция Eloquent, чтобы каждый раз, когда я вызываю Product, в ней уже были все оплаченные User, и каждый раз, когда я вызываю User, в коллекции уже будут все его Product?



Ответы:


1

В Laravel нет встроенной поддержки прямой связи.

Я создал пакет для таких случаев: https://github.com/staudenmeir/eloquent-has-many-deep

class Product extends Model
{
    use \Staudenmeir\EloquentHasManyDeep\HasRelationships;

    public function users()
    {
        return $this->hasManyDeep(
            User::class,
            ['order_items', Order::class],
            [null, null, 'id'],
            [null, null, 'user_id']
        )->whereNotNull('orders.paid');
    }
}

$users = Product::find($id)->users;
31.08.2019
  • это очень полезный пакет, спасибо. Чтобы перейти на следующий уровень, я хочу иметь возможность смотреть на продукт и видеть не только пользователей, которые его купили, но и время, которое можно найти в таблице заказов (orders.updated_at). Любые советы о том, как изменить вышеизложенное или написать для этого новую функцию? 21.07.2020
  • @Jacey Вы видели github.com/staudenmeir/< /а>? 21.07.2020
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]