Ошибка при сортировке при hasOne

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Закрыто
ildar87
Сообщения: 5
Зарегистрирован: 2017.12.14, 20:17

Ошибка при сортировке при hasOne

Сообщение ildar87 »

Всем привет, нид хелп. Сорри, но не нашел.

Имеются таблицы product и product_category, нужно получить в таблице product колонку с наименованием категории из product_category, связываем

model:
public function getCategory() {
return $this->hasOne(ProductCategory::className(), ['id' => 'category_id']);
}

находим
search:
$query = Product::find()->joinWith('category');

//сортировка по категории
$dataProvider->sort->attributes['category'] = [
'asc' => [category.name => SORT_ASC],
'desc' => [category.name => SORT_DESC],
];


Все хорошо отображается, но если попробовать нажать сортировку на категории, получим ошибку.
SELECT product.* FROM product LEFT JOIN product_category ON product.category_id = product_category.id ORDER BY category.name LIMIT 20

Как в сортировке сказать, чтобы выбирал не только поля таблицы product?
ildar87
Сообщения: 5
Зарегистрирован: 2017.12.14, 20:17

Re: Ошибка при сортировке при hasOne

Сообщение ildar87 »

решил, но решение под вопросом
ildar87
Сообщения: 5
Зарегистрирован: 2017.12.14, 20:17

Re: Ошибка при сортировке при hasOne

Сообщение ildar87 »

В обеих таблицах название продукта/категории имеет одинаковое имя "name".

Вопрос: в примерах в сортировке не видел, чтобы приходилось указывать в виде "таблица.поле", т.е. "'asc' => [product_category.name => SORT_ASC]". Находил, такие, где указывают имя функции с hasOne.

Получается, если есть одинаковые наименования полей в обеих таблицах нам нужно указывать наименования таблиц перед переменнными или есть другое решение?


код:

связываем
model:

public function getCategory() {
return $this->hasOne(ProductCategory::className(), ['id' => 'category_id']);
}

ищем
model Search:

$query = Product::find()->joinWith('category');

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

$dataProvider->sort->attributes['category'] = [
'asc' => [product_category.name => SORT_ASC],
'desc' => [product_category.name => SORT_DESC],
];

$query->andFilterWhere([
'id' => $this->id,
'user_id' => $this->user_id,
'category_id' => $this->category_id,
]);

$query->andFilterWhere(['like', 'name', $this->name])
->andFilterWhere(['like', 'text', $this->text])
->andFilterWhere(['like', 'image', $this->image])
->andFilterWhere(['like', 'seo', $this->seo])
// ->andFilterWhere(['like', 'product_category.name', $this->category])
;

показываем
view:
...
<?php Pjax::begin(); ?> <?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
['class' => 'yii\grid\SerialColumn'],
'id',
'user_id',
'category_id',
'name',
'text:ntext',
// 'image',
// 'seo',
[
'attribute' => 'category',
'value' => 'category.name',

],
['class' => 'yii\grid\ActionColumn'],
],
]); ?>
<?php Pjax::end(); ?>
...
ildar87
Сообщения: 5
Зарегистрирован: 2017.12.14, 20:17

Re: Ошибка при сортировке при hasOne

Сообщение ildar87 »

отбой
ildar87
Сообщения: 5
Зарегистрирован: 2017.12.14, 20:17

Re: Ошибка при сортировке при hasOne

Сообщение ildar87 »

может кто наступит на те же грабли. Рабочий вариант
model:
public function getCategory() {
return $this->hasOne(ProductCategory::className(), ['id' => 'category_id']);
}

modelSearch:
class ProductSearch extends Product
{
public $category;
...
public function rules()
{
return [
...
[['category'], 'string'],
];
}
...
$query = Product::find()->joinWith('category');
...
$dataProvider->sort->attributes['category'] = [
'asc' => ['product_category.name' => SORT_ASC],
'desc' => ['product_category.name' => SORT_DESC],
];
...
$query->andFilterWhere(['like', 'name', $this->name])
...
->andFilterWhere(['like', 'product_category.name', $this->category])
;
Закрыто