Поведение find() как hasOne()

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
mvk
Сообщения: 1
Зарегистрирован: 2024.02.07, 18:15

Поведение find() как hasOne()

Сообщение mvk »

Добрый день. Есть две модели Prototype и Model. Явной связи (на уровне полей) между моделями нет, а есть косвенная связь - что бы понять к какому прототипу принадлежит модель нужно найти протоип с полем type = 'myType'.
Prototypes table
id, type, columnN
1 myType ...
2 anothType ...

Испрользовать hasOne у модели в методе getPrototype() не получается.
Можно ли как-то использовать find() так что бы он вёл себя как hasOne ?

Model

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

getPrototype()
{
  Prototype::find()->where(['type' => 'myType']);
}
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: Поведение find() как hasOne()

Сообщение unknownby »

А почему бы не сделать связь по идентификатору между моделями, если вы потом по текстовому полю хотите найти из одной модели в другой?
Можете попробовать установить туже hasOne или hasMany, но не по айдишнику, а по текстовым полям в ваших моделях. Т.е. сделать по аналогии, как делали бы по айди, но вместо айди использовать текстовые поля :D
makinaru
Сообщения: 6
Зарегистрирован: 2021.08.06, 12:24

Re: Поведение find() как hasOne()

Сообщение makinaru »

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

getPrototype()
{
  return $this->hasOne(Prototype::class, ['type' => 'колонка_в_таблице_модели_которая_содержит_название_типа']);
}
Alex@
Сообщения: 568
Зарегистрирован: 2014.12.16, 09:24

Re: Поведение find() как hasOne()

Сообщение Alex@ »

можно написать свой PrototypeQuery и переопределить public function prepare($builder)

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

public function prepare($builder)
    {
        $this->andWhere([тут условие]);

        return parent::prepare($builder);
    }
и вызывать Prototype::find() а условие будет подставляться автоматически
Ответить