2015-10-02 4 views
1

Как я могу добавить, где условие для моей модели статей, чтобы slug (из категории модели) равнялся $ slug?Yii2 Поиск по модели

И это функция, которая Gii генерироваться:

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

Вот мой код:

public function specificItems($slug) 
    { 
    $query = Articles::find()->with('category'); 
    $countQuery = clone $query; 
    $pages = new Pagination(['totalCount' => $countQuery->count(),'pageSize' => 12]); 
    $articles = $query->offset($pages->offset) 
     ->limit($pages->limit) 
     ->all(); 
    return ['articles' => $articles,'pages' => $pages]; 
    } 

ответ

1

Ваш SQL-запрос должен содержать столбцы из обеих статей и таблице категорий. Для этого вам нужно использовать joinWith().

$result = Articles::find() 
    ->joinWith('category') 
    ->andWhere(['category.slug' => $slug]) 
    ->all(); 

Где «категория» - это название вашей категории.

Однако в вашем коде вы отклоняетесь от определенных рекомендаций. Я бы рекомендовал следующее:

  • Есть как имя таблицы и класс модели в единственном числе (Article и article). Отношение может быть во множественном числе, например, getCategories, если статья имеет несколько категорий.

  • Избегайте функций, возвращающих наборы результатов. Лучше вернуть класс ActiveQuery. Если у вас есть объект запроса, все, что вам нужно для получения реальных моделей, - ->all(). Однако вы можете дополнительно управлять этим объектом, добавлять дополнительные условия, изменять формат результата (->asArray()) и другие полезные материалы. Возвращение массива результатов не позволяет этого.

  • Рассмотрите возможность расширения ActiveQuery класса в ArticleQuery и осуществления условий там. Затем вы сможете делать что-то вроде Article::find()->joinWith('category')->byCategorySlug('foo')->all().

Смежные вопросы