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
с и Favorite
s один ко многим (скорее всего) или
/**
* @return \yii\db\ActiveQuery
*/
public function getFavorite()
{
return $this->hasOne(Favorite::className(), ['book_id' => 'ID']);
}
если отношение один к одному.
Вы можете использовать joinWith()
с "фаворитом" или "фаворитами" в зависимости от кратности ваших отношений.