Я использую CakePHP 3.7.7, и у меня есть рабочая ассоциация между моими сообщениями и тегами.В моем представлении «Сообщения» мне удалось перечислить все связанные теги через , содержащие , и все работает как нужно.
Однако ниже основного содержимого сообщения мне нужно показать некоторые «связанные сообщения» предложения.
Я искал ответ, и я думаю, что решение могло бы быть с использованием сопоставления , но я не смог получить желаемые результаты для моего запроса.
Мои модели:
class PostsTable extends Table
{
public function initialize(array $config)
{
parent::initialize($config);
$this->setTable('posts');
$this->setDisplayField('name');
$this->setPrimaryKey('id');
$this->belongsToMany('Tags', [
'foreignKey' => 'post_id',
'targetForeignKey' => 'tag_id',
'joinTable' => 'posts_tags',
'dependant' => false
]);
}
}
class TagsTable extends Table
{
public function initialize(array $config)
{
parent::initialize($config);
$this->setTable('Tags');
$this->setDisplayField('title');
$this->setPrimaryKey('id');
$this->belongsTo('Tags', [
'foreignKey' => 'tag_id',
'joinType' => 'INNER'
]);
$this->belongsToMany('Posts');
}
}
class PostsTagsTable extends Table
{
public function initialize(array $config)
{
parent::initialize($config);
$this->setTable('posts_tags');
$this->setDisplayField('id');
$this->setPrimaryKey('id');
$this->belongsTo('Posts', [
'foreignKey' => 'post_id',
'joinType' => 'INNER'
]);
$this->belongsTo('Tags', [
'foreignKey' => 'tag_id',
'joinType' => 'INNER'
]);
}
}
И мой контроллер:
class PostsController extends AppController
{
public function view($slug = null)
{
$post = $this->Posts->findBySlug($slug)
->contain(['Tags'])
->first();
$this->set('post', $post);
}
}
Я попытался добавить это в функцию просмотра:
$relId = $post->Tags->id;
$related = $this->Posts->find('all')
->contain(['PostsTags','Tags'])
->matching('PostsTags', function(\Cake\ORM\Query $query) use ($post) {
return $query->where([
'PostsTags.tag_id' => $relPost
]);
})
->limit(3)
->execute();
$this->set('relatedPosts', $related);
...но это не работаетЯ получаю сообщение об ошибке:
Уведомление (8): пытаюсь получить свойство необъекта
Так что, очевидно, я не могу получить правильноемассив с идентификаторами тегов, соответствующими тем, которые относятся к текущему сообщению.
Как я могу заставить его работать?Или какой будет лучшая альтернатива?