2016-04-30 26 views
1

假设我们有两个模型:UsersPosts这些模型之间定义了多对多的关系 - 用户可以有许多帖子,帖子可以有许多编辑者(用户)。有没有办法将作业委托给Laravel中的另一项操作?

当这个表格被提交到PostsController,它的store行动不仅必须处理新的职位的领域,而且它的编辑,这似乎是错误的。例子:

enter image description here

public function store() 
{ 
    // creating a post 
    $post = Post::create(request()->get('post_fields')); 

    // adding editors to the post (this should be done somewhere else) 
    $editors = request()->get('editors'); 
    foreach($editors as $editor){ 
     $post->editors()->attach($editor->id); 
    } 

    return redirect('/'); 
} 

正如我已经提到的,这种做法似乎是错误的,笨拙的我。正因为如此,我想代表编辑处理任务到PostsEditorsController,这将是一个单独的控制器专用于posts-editors关系管理。所以store现在是这个样子:

public function store() 
{ 
    // creating a post 
    $post = Post::create(request()->get('post_fields')); 

    $editors = request()->get('editors'); 
    PostsEditorsController::doSomething($post, $editors); // <-- just to show what I want to achieve 

    return redirect('/'); 
} 

我怎样才能做到这一点?

回答

1

将此逻辑添加到Post模型的保存事件如何?

https://laravel.com/docs/5.2/eloquent#events

这样,这个逻辑将调用的模型保存任何时间,节省你担心保存,如果你在系统中添加编辑其他已同步的大惊小怪。

+0

这是解决此问题的好方法,但我认为使用控制器来完成这项工作感觉更自然。另外,你会在其他没有事件发生的框架中做什么?纠正我,如果我错了。 –

+0

你说得对,用事件处理控制器数据可能有点尴尬,但试图进一步简化这个可能会有些荒谬。您可以通过执行'$ post-> sync('editors',$ editors-> pluck('id'));',IIRC来轻松地将它们汇总成一行。这是一条线 - 不会变得更简单。 – Josh

+0

这个问题更多关于**应该在哪里完成,而不是**如何**。所以,'$ post-> sync('editors',$ editors-> pluck('id'));'必须留在'store'行为中,还是应该到别的地方去?如果我们在'store'方法中有更多的“副作用”,它应该只存储发布数据,它会变得非常庞大。对不起,如果我不够清楚。 –

相关问题