我正在开发cakephp 3.0,我喜欢使用插件,我以插件的形式编写了我的应用程序,我的问题是cakephp 3.0不允许整个插件中的可容纳行为及其显示模型未关联
我创建了两个插件Auth和Comments:
Auth插件中的控制器
Auth插件中的模型
在cakephp 3.0中,模型的变化与2.x相比,它们具有Entity和ModelTable,因此Auth Model Tables低于
UsersTable: -
<?php
namespace Auth\Model\Table;
use Auth\Model\Entity\User;
use Cake\ORM\Query;
use Cake\ORM\RulesChecker;
use Cake\ORM\Table;
use Cake\Validation\Validator;
class UsersTable extends Table
{
public function initialize(array $config)
{
parent::initialize($config);
$this->table('users');
$this->displayField('name');
$this->primaryKey('id');
$this->addBehavior('Timestamp');
$this->belongsTo('Roles', [
'foreignKey' => 'role_id',
'joinType' => 'INNER',
'className' => 'Auth.Roles'
]);
$this->hasMany('Comments', [
'foreignKey' => 'user_id',
'className' => 'Auth.Comments'
]);
$this->hasMany('Contents', [
'foreignKey' => 'user_id',
'className' => 'Auth.Contents'
]);
}
public function validationDefault(Validator $validator)
{
return $validator;
}
public function buildRules(RulesChecker $rules)
{
$rules->add($rules->isUnique(['email']));
$rules->add($rules->isUnique(['username']));
$rules->add($rules->existsIn(['role_id'], 'Roles'));
return $rules;
}}
RolesTable
<?php
namespace Auth\Model\Table;
use Auth\Model\Entity\Role;
use Cake\ORM\Query;
use Cake\ORM\RulesChecker;
use Cake\ORM\Table;
use Cake\Validation\Validator;
class RolesTable extends Table
{
public function initialize(array $config)
{
parent::initialize($config);
$this->table('roles');
$this->displayField('id');
$this->primaryKey('id');
$this->addBehavior('Timestamp');
$this->hasMany('Users', [
'foreignKey' => 'role_id',
'className' => 'Auth.Users'
]);
}
public function validationDefault(Validator $validator)
{
return $validator;
}
}
CommentsPlugin
评论插件中的控制器
评论插件中的模型
CommentsTable
<?php
namespace Comments\Model\Table;
use Cake\ORM\Query;
use Cake\ORM\RulesChecker;
use Cake\ORM\Table;
use Cake\Validation\Validator;
use Comments\Model\Entity\Comment;
class CommentsTable extends Table
{
public function initialize(array $config)
{
parent::initialize($config);
$this->table('comments');
$this->displayField('name');
$this->primaryKey('id');
$this->addBehavior('Timestamp');
$this->addBehavior('Tree');
$this->belongsTo('ParentComments', [
'className' => 'Comments.Comments',
'foreignKey' => 'parent_id'
]);
$this->belongsTo('Users', [
'foreignKey' => 'user_id',
'className' => 'Comments.Users'
]);
$this->belongsTo('Contents', [
'foreignKey' => 'content_id',
'joinType' => 'INNER',
'className' => 'Comments.Contents'
]);
$this->hasMany('ChildComments', [
'className' => 'Comments.Comments',
'foreignKey' => 'parent_id'
]);
}
public function validationDefault(Validator $validator)
{
return $validator;
}
public function buildRules(RulesChecker $rules)
{
$rules->add($rules->isUnique(['email']));
$rules->add($rules->existsIn(['parent_id'], 'ParentComments'));
$rules->add($rules->existsIn(['user_id'], 'Users'));
$rules->add($rules->existsIn(['content_id'], 'Contents'));
return $rules;
}
}
现在我想在评论控制器中获取所有用户的相关数据,我这样做:
$this->Comments->Users->find('all',[
'contain'=>['Roles']
])
它的显示错误用户与角色无关但它在旧版本的cakephp(2.7)中工作
答案 0 :(得分:0)
不再有可包含的行为,contains现在是ORM的一部分,它通常适用于插件模型/关联。我建议开始调试非常具体的错误消息告诉你的内容,检查为什么Comment.Users和Comments.Contents使用自动表(\ Cake \ ORM \ Table的实例)而不是表类的具体实例!对我而言,您似乎想要使用Auth.Users而不是Comments.Users。
我从@ndm
所写问题的第一条评论中复制了这些内容