Yii2 "не имеет отношения к имени" в поисковой модели, даже если она определена в основной модели

У меня ошибка yii2: общие \models\Book не имеют отношения с именем "избранное".

Когда я пытаюсь добавить:

public function search($params) {
    $query = Book::find();
    $query->joinWith(['author', 'profile', 'favorite']);

В модели книги у меня есть публичная функция:

public function getFavoritedIcon() {
    if (isset($this->favorite)) {
        return '<i class="glyphicon glyphicon-asterisk books-form"></i>';
    } else {
        return '';
    }
}

А также эта дополнительная функция, чтобы получить значок

public function getFavoritedIcon() {
    if (isset($this->favorite)) {
        return $icon;
    } else {
        return '';
    }
}

И это прекрасно работает в сетке, где я хочу добавить сортировку и фильтр:

[
    'label' => 'Favorites',
    'attribute' => 'favorite',
    'value' => 'favoritedIcon',
    'hAlign' => 'center',
    'vAlign' => 'middle',
    'format' => 'raw',
    'width' => '50px',
],

Я делаю разные вещи из других моделей, которые я использую:

  • в сетке я получаю значение в виде значка из модели книги, но я использовал это раньше.
  • Другое дело, что модель Favorite не совпадает с именем таблицы, но она отлично работает в сетке.

абстрактный класс Favorite extends \yii\db\ActiveRecord {

    public static function tableName()
    {
        return 'user_favorite';
    }


    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['user_id', 'book_id'], 'required'],
            [['user_id', 'book_id'], 'integer'],
            [['selectedTime'], 'safe']
        ];
    }

Любые подсказки, что я делаю не так?

================================================== ====

ОБНОВЛЕНИЕ после ответа Педро дель Соль

В коде были некоторые ошибки, но на главную ответил Педро, у меня была любимая функция в модели Book, но нет избранных с несколькими выходами.

Так что теперь это работает так:

В книжной модели

    public function getFavorite() {
    $userID = Yii::$app->user->identity->id;
    return Favorite::find()->where(['user_id' => $userID, 'book_id' => $this->id])->one();
}

public function getFavorites() {
    $userID = Yii::$app->user->identity->id;
    return $this->hasMany(Favorite::className(), ['book_id' => 'id'], ['book_id' => $this->id]);
}
public function getFavoritedIcon() {
    if (isset($this->favorite)) {
        return '<i class="glyphicon glyphicon-asterisk books-form"></i>';
    } else {
        return '';
    }
}

В модели BookSearch:

    public function search($params) {
    $query = Book::find();
    $query->joinWith(['favorites']);

    $dataProvider = new ActiveDataProvider([
        'query' => $query,
    ]);

    $dataProvider->setSort([
        'attributes' => [
            'title',
            'author_id',
            'rights_owner_id',
            'user_favorite.user_id',
        ]
    ]);

и вид сетки:

        [
        'label' => 'Favorites',
        'attribute' => 'user_favorite.user_id',
        'value' => 'favoritedIcon',
        'hAlign' => 'center',
        'vAlign' => 'middle',
        'format' => 'raw',
        'width' => '50px',
    ],

1 ответ

Решение

Наличие метода для getFavoritedIcon() это не то же самое, что объявить отношение к getFavorite()

Я полагаю, что в вашем Book класс модели у вас есть методы getAuthor() а также getProfile() который будет возвращать запросы, связывающие Book с Author и Profile, Вам нужно что-то подобное с Favorite(s) но я подозреваю, что кратности будут различными.

Я думаю, что для объявления ваших отношений вам понадобится что-то вроде

/**
 * @return \yii\db\ActiveQuery
 */
public function getFavorites()
{
    return $this->hasMany(Favorite::className(), ['book_id' => 'ID']);
}

если связь между Bookс и Favorites один ко многим (скорее всего) или

/**
 * @return \yii\db\ActiveQuery
 */
public function getFavorite()
{
    return $this->hasOne(Favorite::className(), ['book_id' => 'ID']);
}

если отношение один к одному.

Вы можете использовать joinWith() с "фаворитом" или "фаворитами" в зависимости от кратности ваших отношений.

Другие вопросы по тегам