Yii2"没有名字"在搜索模型甚至是在主模型中定义的函数

时间:2017-03-02 13:35:14

标签: php yii2 relation yii2-model

我遇到了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',
],

我使用的其他模型做了一些不同的事情:

    网格中的
  • 我从图书模型中获取了作为图标的值,但我之前使用过它。
  • 另一件事是,收藏夹模型与该表的名称不同但在网格中工作正常

抽象类收藏者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']
        ];
    }

有什么线索我做错了吗?

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

Pedro del Sol回答后的更新

代码中有一些错误,但是主要的一个是由Pedro回答的,我确实在Book模型中有一个最喜欢的功能,但不是多个输出的收藏夹。

所以现在它的工作方式如下:

在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 个答案:

答案 0 :(得分:6)

将方法设为getFavoritedIcon()与声明与getFavorite()

的关系不同

我假设您的Book模型类中有方法getAuthor()getProfile(),它们会返回将BookAuthorProfile相关联的查询Favorite。您需要与/** * @return \yii\db\ActiveQuery */ public function getFavorites() { return $this->hasMany(Favorite::className(), ['book_id' => 'ID']); } (s)类似的内容,但我怀疑多重性会有所不同。

我想宣布你的关系,你需要像

这样的东西
Book

如果Favorite/** * @return \yii\db\ActiveQuery */ public function getFavorite() { return $this->hasOne(Favorite::className(), ['book_id' => 'ID']); } 之间的关系是一对多(最有可能)或

joinWith()

如果关系是一对一的。

然后,您可以将IF CSTR({Command.payment_ind_vsl}) = "F" OR CSTR({Command.payment_ind_mi}) = "F" OR CSTR({Command.payment_ind_ci}) = "F" THEN "Completed" ELSE "In Progress" 与“最喜欢的”&#39;或者&#39;收藏夹&#39;取决于你的关系的多重性。