CakePHP在行为中声明模型关联
我正在建立一个“通知”系统,并且正在研究一种应报告的行为,我的目标是将其附加到各种对象上——帖子、交易、朋友等。当我使用在每个模型中声明的手动关联进行这项工作时,我希望我可以让每个模型CakePHP在行为中声明模型关联,cakephp,Cakephp,我正在建立一个“通知”系统,并且正在研究一种应报告的行为,我的目标是将其附加到各种对象上——帖子、交易、朋友等。当我使用在每个模型中声明的手动关联进行这项工作时,我希望我可以让每个模型$actsAs成为可报告的,并从其中动态声明模型关联。这将节省相当多的代码行,并使其在将来更具可扩展性 模型结构就是一个很好的例子: Post id post_content 通知 id type parent_id 目的是将这些模型(以及任何其他“应通知”模型)关联起来,方法是:Post有许多通知,其中Not
$actsAs成为可报告的
,并从其中动态声明模型关联。这将节省相当多的代码行,并使其在将来更具可扩展性
模型结构就是一个很好的例子:
Post
id
post_content
通知
id
type
parent_id
目的是将这些模型(以及任何其他“应通知”模型)关联起来,方法是:Post有许多通知,其中Notification.type='Post'和Notification.parent\u id=Post.id
或类似的内容
我遇到了问题。首先,SQL返回一个错误,即在引用的模型中找不到相关列。第二个问题是,我的contains()
函数也无法找到关联的模型
Post模型
class Post extends AppModel {
public $name = 'Post'
public $actsAs = array( 'Containable', 'Notifiable' );
}
应通报的行为
public function setup(Model $Model, $settings = array()) {
if (!isset($this->settings[$Model->alias])) {
$this->settings[$Model->alias] = array();
}
$this->settings[$Model->alias] = array_merge($this->settings[$Model->alias], $settings);
$Model->bindModel( array(
'hasMany' => array(
'Notification' => array(
'className' => 'Notification',
'foreignKey' => 'parent_id',
'conditions' => array(
'Notification.type = "' . $Model->name . '"',
),
'dependent' => true,
),
),
), false );
$Model->Notification->bindModel( array(
'belongsTo' => array(
$Model->name => array(
'className' => $Model->name,
'foreignKey' => 'parent_id',
'conditions' => array(
'Notification.type = "' . $Model->name . '"',
)
)
)
), false );
}
我是不是走错了路,或者我对什么行为的理解有点偏差?我知道bindModel将一直工作到请求结束,并将false
设置为第二个变量。但是,当在行为中声明时,这些关联是否不能全局访问
换句话说,如果我有一个通知控制器
,它有:
'contain' => array(
'Friend',
'Post',
'Transaction'
)
如果这些模型actAs
应报告,这是否有效?正如我所说,如果我在每个模型中手动声明模型关联,我就可以让它工作。但是在通知
模型的情况下,这变得很麻烦,我必须为每个应报告
模型声明:
$belongsTo = array(
'ModelAlias' => array(
'className' => 'Model',
'foreignKey' => 'parent_id',
'conditions' => array(
'Notification.type' => 'Model'
)
)
);
因此,在可伸缩性方面,我不希望每次添加我认为应该通知的新模型时都必须继续手动声明这些关联
我希望我已经解释得足够清楚了。我仍然掌握着CakePHP,所以如果我在这个问题上完全错了,请告诉我
谢谢
编辑:
要简化问题和错误的描述,请执行以下操作:
我有应呈报的交易行为
。我的应呈报
行为的代码仍与上面显示的相同。预期功能是声明事务具有多个通知
和通知属于事务
。在myTransactionController
中,我尝试使用以下方法对通知模型进行分页:
$this->Paginator->settings = array(
'contain' => array(
'Transaction',
)
'limit' => 5,
);
$this->notifications = $this->Paginator->paginate( 'Notification' );
$this->set( 'notifications', $this->notifications );
我收到的是一组通知
模型,这些模型没有任何与之相关的属性附加到
模型,以及错误:
Notice (8): Undefined index: Transaction [APP/View/Notifications/index.ctp, line 10]
我拥有的每个应呈报
模型都会发生同样的情况,除非我在应用程序的其他地方明确实例化它们,并/或手动将其附加到应呈报
模型
我觉得这可能与$Model->Notification->belongsTo
的声明有关,它将通知显式地分配给模型,而不是将通知模型本身声明为具有该关联,如果这有任何意义的话
这有助于澄清问题吗
编辑:
我发现如果我显式调用
$this->Transaction->create()代码>(或任何其他<代码>应呈报<代码>模型上的<代码>创建()
),在我运行<代码>$this->paginate()之前,在我的<代码>通知控制器中代码>,关联将正确返回。然而,如果我必须在运行查询之前手动创建/声明每个应报告的对象,那么这有点违背了我试图创建的自动化的目的。我发现,当我在这样的行为中声明关联时,它似乎更像您希望的那样“自动”工作。最近遇到了和你一样的问题。我想这可能是个解决办法。试试看
public function setup(Model $Model, $settings = array()) {
$Model->hasMany = array(
//set associations here
);
}
它应该对我有用,这是使用行为的正确方式。我只是想在'conditions'=>数组('Notification.type'=>$Model->name)
中更改您的条件,但我认为这不是问题所在。你能更具体地编辑你的问题并插入你得到的错误吗?谢谢。今晚我会更新更多的信息。作为一个后续问题,这可能会更好地说明这个问题:使用bindModel
在一个行为中是否以这种方式进行关联,其他模型是否可以使用?如果我在NotifiableBehavior
中定义了Post拥有多个通知
,那么如果User拥有多个Post
,如果我这样做了User->find()
,那么Post
模型是否也会自动返回其关联的通知?这似乎没有发生。再次感谢您,我将尽快更新。是的,应该更新,但这取决于您如何设置递归。再次感谢您迄今为止的帮助。我已经编辑了原始帖子,包括我收到的错误以及我收到错误的环境。我觉得我知道可能是什么问题,但我不知道如何解决它代码>但只需`$this->分页('Notification');`或者,如果您在NotificationsController中,只需$this->paginate()