Всем привет, нид хелп. Сорри, но не нашел.
Имеются таблицы 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?
Ошибка при сортировке при hasOne
Re: Ошибка при сортировке при hasOne
решил, но решение под вопросом
Re: Ошибка при сортировке при hasOne
В обеих таблицах название продукта/категории имеет одинаковое имя "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(); ?>
...
Вопрос: в примерах в сортировке не видел, чтобы приходилось указывать в виде "таблица.поле", т.е. "'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(); ?>
...
Re: Ошибка при сортировке при hasOne
может кто наступит на те же грабли. Рабочий вариант
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])
;
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])
;