CakePHP 3 объединяет таблицы ассоциаций

1

Хорошо, у меня есть некоторые проблемы, которые понимают, как работают ассоциации, особенно принадлежит этой настройке:

Статьи могут иметь несколько категорий
Категории могут принадлежать нескольким статьям

поэтому в моей базе данных у меня есть 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]);
}

Это своего рода работа, но я также должен иметь возможность ограничить количество связанных статей..

  • 0
    «Категории могут принадлежать нескольким статьям» почему?
  • 0
    Вы можете иметь несколько статей в одной категории
Теги:
orm
cakephp
cakephp-3.0

1 ответ

2
Лучший ответ

вы можете изменить объект запроса, используемый для загрузки связанных моделей:

$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);

Я не тестировал последний, но я думаю, что что-то вроде этого должно работать

Но, как вы можете видеть, сложность более о менее одинаковая

  • 0
    Это работает, но действительно ли это самый простой способ сделать это?
  • 0
    взгляните на мою правку
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню