Yii2 "has no relation named" at search model even the function it is defined in the main model
Yii2 "has no relation named" at search model even the function it is defined in the main model
我有一个 yii2 错误:common\models\Book 没有名为 "favorite".
的关系
当我尝试添加时:
public function search($params) {
$query = Book::find();
$query->joinWith(['author', 'profile', 'favorite']);
在书籍模型中我有 public 函数:
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',
],
我做了一些与我正在使用的其他模型不同的事情:
- 在网格中,我从书本模型中获得作为图标的值,但我之前使用过它。
- 另一件事是最喜欢的模型与 table 的名称不同,但它在网格中工作正常
摘要 class 收藏扩展 \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 模型中确实有一个最喜欢的函数,但没有多个输出的收藏夹。
所以现在它是这样工作的:
在图书模型中
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',
],
拥有 getFavoritedIcon()
的方法与声明 getFavorite()
的关系不同
我假设在你的 Book
模型 class 中你有方法 getAuthor()
和 getProfile()
这将 return 查询链接 Book
与 Author
和 Profile
。您将需要与 Favorite
(s) 类似的东西,但我怀疑多重性会有所不同。
我认为要声明你们的关系,您需要像
这样的东西
/**
* @return \yii\db\ActiveQuery
*/
public function getFavorites()
{
return $this->hasMany(Favorite::className(), ['book_id' => 'ID']);
}
如果 Book
s 和 Favorite
s 之间的关系是一对多(最有可能)或
/**
* @return \yii\db\ActiveQuery
*/
public function getFavorite()
{
return $this->hasOne(Favorite::className(), ['book_id' => 'ID']);
}
如果关系是一对一的。
然后您可以将 joinWith()
与 'favorite' 或 'favorites' 结合使用,具体取决于您关系的多重性。
我有一个 yii2 错误:common\models\Book 没有名为 "favorite".
的关系当我尝试添加时:
public function search($params) {
$query = Book::find();
$query->joinWith(['author', 'profile', 'favorite']);
在书籍模型中我有 public 函数:
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',
],
我做了一些与我正在使用的其他模型不同的事情:
- 在网格中,我从书本模型中获得作为图标的值,但我之前使用过它。
- 另一件事是最喜欢的模型与 table 的名称不同,但它在网格中工作正常
摘要 class 收藏扩展 \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 模型中确实有一个最喜欢的函数,但没有多个输出的收藏夹。
所以现在它是这样工作的:
在图书模型中
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',
],
拥有 getFavoritedIcon()
的方法与声明 getFavorite()
我假设在你的 Book
模型 class 中你有方法 getAuthor()
和 getProfile()
这将 return 查询链接 Book
与 Author
和 Profile
。您将需要与 Favorite
(s) 类似的东西,但我怀疑多重性会有所不同。
我认为要声明你们的关系,您需要像
这样的东西/**
* @return \yii\db\ActiveQuery
*/
public function getFavorites()
{
return $this->hasMany(Favorite::className(), ['book_id' => 'ID']);
}
如果 Book
s 和 Favorite
s 之间的关系是一对多(最有可能)或
/**
* @return \yii\db\ActiveQuery
*/
public function getFavorite()
{
return $this->hasOne(Favorite::className(), ['book_id' => 'ID']);
}
如果关系是一对一的。
然后您可以将 joinWith()
与 'favorite' 或 'favorites' 结合使用,具体取决于您关系的多重性。