Страница 1 из 1

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

Добавлено: 2024.02.07, 18:35
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']);
}

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

Добавлено: 2024.02.13, 21:34
unknownby
А почему бы не сделать связь по идентификатору между моделями, если вы потом по текстовому полю хотите найти из одной модели в другой?
Можете попробовать установить туже hasOne или hasMany, но не по айдишнику, а по текстовым полям в ваших моделях. Т.е. сделать по аналогии, как делали бы по айди, но вместо айди использовать текстовые поля :D

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

Добавлено: 2024.02.14, 20:24
makinaru

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

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

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

Добавлено: 2024.03.07, 04:46
Alex@
можно написать свой PrototypeQuery и переопределить public function prepare($builder)

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

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

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