Как сделать hasmany() c двумя условиями в ON?

В Yii можно использовать метод hasMany() вместе с двумя условиями ON для создания отношения между двумя моделями. Давайте рассмотрим пример с использованием Yii 2.

Предположим, у нас есть две модели: User и Order. Связь между ними состоит в том, что каждый пользователь может иметь множество заказов. Однако, для того чтобы создать отношение "hasMany()" с двумя условиями в ON, создадим еще одну модель OrderItem, которая будет содержать информацию о конкретных товарах в каждом заказе.

При условии, что таблицы базы данных имеют следующую структуру:

Таблица user:
- id (PRIMARY KEY)
- name
- email

Таблица order:
- id (PRIMARY KEY)
- user_id (FOREIGN KEY)
- order_date

Таблица order_item:
- id (PRIMARY KEY)
- order_id (FOREIGN KEY)
- product_name
- quantity

Создадим три модели User, Order и OrderItem.

Модель User будет иметь метод getOrders(), который определит отношение "hasMany()" с моделью Order с условием ON по полю user_id:

public function getOrders()
{
    return $this->hasMany(Order::class, ['user_id' => 'id']);
}

Модель Order будет иметь метод getOrderItems(), который определит отношение "hasMany()" с моделью OrderItem с двумя условиями ON по полям order_id и product_name:

public function getOrderItems()
{
    return $this->hasMany(OrderItem::class, ['order_id' => 'id'])
        ->onCondition(['product_name' => 'some_product_name']);
}

Таким образом, мы создали отношение, где каждый заказ может иметь множество позиций товаров, но только для товаров с определенным именем 'some_product_name'.

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

$user = User::findOne($userId);
$orders = $user->getOrders()->all();

Или чтобы получить список товаров для конкретного заказа:

$order = Order::findOne($orderId);
$orderItems = $order->getOrderItems()->all();

Это пример настройки отношений "hasMany()" с двумя условиями ON в Yii. Надеюсь, это вам поможет в решении вашей задачи!