我想在后端添加相关模型时调用函数。 这可以通过使用数据透视模型来实现,但在这种情况下必须有一些数据透视数据,否则不会触发数据透视模型事件。
我不需要任何数据透视数据,只是为了监听关系添加事件。
答案 0 :(得分:1)
我认为此问题已解决,请参见此pull request和API Docs。他们为多对多关系添加了4个事件:afterAttach, afterDetach, beforeAttach and beforeDetach
答案 1 :(得分:0)
你问的问题很复杂,也不容易实现。
如果查看关系管理器行为的函数onRelationManageCreate,您可以看到它不会触发任何事件。
我建议你扩展行为,用你自己的方法覆盖onRelationManageCreate()方法,并使用你自己的行为而不是关系管理器行为。
public MyRelationController extends RelationController
{
public function afterRelationCreate()
{
}
public function onRelationManageCreate()
{
parent::onRelationManageCreate();
$this->afterRelationCreate();
}
}
当然,这对于链接记录,选择下拉列表,关系表单,复选框列表都没有作用。
如果你真的希望抓住它,你需要听取创建的模型的onCreate方法。
答案 2 :(得分:0)
我猜这只适用于“belongsTo”关系
我认为在那里添加了关系,但它没有直接保存到数据库中,因为它将首先存储在不同的表中,因此我们可以拦截它。
所以如果你可以在“DeferredBinding”模型表上监听事件,你就可以实现你想要的目标。
与DeferredBinding表一样,它包含所有相关信息:
Schema::create('deferred_bindings', function(Blueprint $table)
{
$table->engine = 'InnoDB';
$table->increments('id');
$table->string('master_type')->index();
$table->string('master_field')->index();
$table->string('slave_type')->index();
$table->string('slave_id')->index();
$table->string('session_key');
$table->boolean('is_bind')->default(true);
$table->timestamps();
});
你可以看到你可以在那里获得大量信息。
use October\Rain\Database\Models\DeferredBinding as DeferredBindingModel;
然后使用这个模型:
DeferredBindingModel::saved(function($model) {
// you can check relations etc if your parent model is foo
// then you can check for which model this data is sotred
// $model->master_type it will be you model's full name space
// you can compare it
if($model->master_type == 'foo') {
// your interception code here
}
}
请告知我们是否有帮助:)。