HDApache
@HDApache
PHP программист

Как в YII2 выбрать данные с учетом значения в связочной таблице?

Есть модель Personal и есть модель Clinic
Связь между ними многие ко многим через связочную таблицу l_personal2clinic

В модели Personal связь описана так:
public function getClinics() {
        return $this->hasMany(Clinic::className(), ['id' => 'clinic_id'])
          ->viaTable('l_personal2clinic', ['personal_id' => 'id'])
          ->andWhere(['status' => 1]);
    }


Как выбрать из модели Personal всех кто связан с одной конкретной клиникой, скажем с clinic_id = 5
А еще лучше что бы не по одному ID клиники а по нескольким сразу... Если так можно.

Еще к тому же должна быть возможность фильтровать по значениям атрибутов модели Personal

Т.е. например выбрать всех с именем Алексей которые работают в клиниках с ID 5,14,34
  • Вопрос задан
  • 945 просмотров
Решения вопроса 2
@Dialog
Если я верно понимаю, то если делать через relation, то для решения первой части задачи:

> Как выбрать из модели Personal всех кто связан с одной конкретной клиникой, скажем с clinic_id = 5

relation необходимо строить со стороны Clinic и выбирать всех Personal

> А еще лучше что бы не по одному ID клиники а по нескольким сразу... Если так можно.

выборка value IN (x, y, z) и циклом перебирать модели, вызывая relation

> Еще к тому же должна быть возможность фильтровать по значениям атрибутов модели Personal
> Т.е. например выбрать всех с именем Алексей которые работают в клиниках с ID 5,14,34

отдельный геттер, я думаю.

Для таких операций я бы рекомендовал посмотреть все таки в сторону SQL запросов :)
Ответ написан
@Mishutka2000
> Т.е. например выбрать всех с именем Алексей которые работают в клиниках с ID 5,14,34
SELECT *  FROM Personal
JOIN personal2clinic  ON personal_id = id
 	   WHERE clinic_id IN (5,14,34) 
GROUP BY id
HAVING name="Алексей"

> Как выбрать из модели Personal всех кто связан с одной конкретной клиникой, скажем с clinic_id = 5 ... А еще лучше что бы не по одному ID клиники а по нескольким сразу... Если так можно.
SELECT *  FROM Personal
JOIN personal2clinic  ON personal_id = id
 	   WHERE clinic_id IN (5,14,34) 
GROUP BY id

Или один общий универсальный:
SELECT *  FROM Personal
JOIN personal2clinic  ON personal_id = id
 	   WHERE clinic_id IN (5,14,34) 
GROUP BY id
HAVING name LIKE 'Ви%' # вернет: Виталиков, Викторов, Викентиев, Викторий
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
stuff.cebe.cc/yii2docs/guide-db-active-record.html
// find customers and bring back together their country and active orders
// SELECT * FROM `customer`
// SELECT * FROM `country` WHERE `id` IN (...)
// SELECT * FROM `order` WHERE `customer_id` IN (...) AND `status` = 1
$customers = Customer::find()->with([
    'country',
    'orders' => function ($query) {
        $query->andWhere(['status' => Order::STATUS_ACTIVE]);
    },
])->all();
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы