Хорошо, у меня есть некоторые проблемы, которые понимают, как работают ассоциации, особенно принадлежит этой настройке:
Статьи могут иметь несколько категорий
Категории могут принадлежать нескольким статьям
поэтому в моей базе данных у меня есть 3 таблицы: articles
, categories
и таблица join articles_categories
Таблица /ArticlesTable.php:
public function initialize(array $config)
{
$this->addBehavior('Timestamp');
$this->table('articles');
$this->belongsTo('Users');
$this->belongsToMany('Categories', [
'through' => 'ArticlesCategories',
'alias' => 'Categories',
'foreignKey' => 'article_id',
'joinTable' => 'articles_categories',
'targetForeignKey' => 'category_id'
]);
}
Таблица /CategoriesTable.php:
public function initialize(array $config)
{
$this->table('categories');
$this->displayField('name');
$this->primaryKey('id');
$this->addBehavior('Timestamp');
$this->belongsToMany('Articles', [
'through' => 'ArticlesCategories',
'alias' => 'Articles',
'foreignKey' => 'category_id',
'joinTable' => 'articles_categories',
'targetForeignKey' => 'article_id'
]);
}
Таблица /ArticlesCategoriesTable.php:
public function initialize(array $config)
{
$this->belongsTo('Articles');
$this->belongsTo('Categories');
}
Теперь внутри в действии view
CategoriesController.php я могу просмотреть определенную категорию, и мне нужно получить некоторые статьи, относящиеся к этой категории. Каков правильный способ сделать такое? Вот что я имею:
public function view($id = null)
{
$category = $this->Categories->find('all',['limit'=>1])->where(['Categories.id' => $id])->contain(['Articles']);
$this->set(['category'=> $category]);
}
Это своего рода работа, но я также должен иметь возможность ограничить количество связанных статей..
вы можете изменить объект запроса, используемый для загрузки связанных моделей:
$category = $this->Categories->find('all',['limit'=>1])
->where(['Categories.id' => $id])
->contain(['Articles' => function($q) {
$q->limit(10);
return $q;
}
]);
изменение: или вы можете сделать
$category = $this->Categories->get($id,
[
'contain' => [
'Articles' => function($q) {
$q->limit(10);
return $q;
}
]);
или, возможно, если вы хотите Статьи без данных категории, вы можете использовать соответствующие
$articles = $this->Categories->Articles->find()
->matching('Categories', function ($q) use $id{
return $q->where(['id' => $id])
->limit(10);
Я не тестировал последний, но я думаю, что что-то вроде этого должно работать
Но, как вы можете видеть, сложность более о менее одинаковая