【问题标题】:Laravel pass object from view to controllerLaravel 将对象从视图传递到控制器
【发布时间】:2017-03-31 06:59:51
【问题描述】:

鉴于这 3 个表格,寻找最佳做法:

任务(ID、标题、描述) 用户(ID,姓名) user_task(user_id, task_id)

我的班级/对象用户有一个函数 addToCompletedTasks(Task task) 可以将任务添加到他的已完成任务列表中(将任务添加到表 User_task 中)。

我正在寻找将完成的任务从我的视图发送到我的控制器的最佳做法。 现在我正在发送一个 ID,但我想知道是否可以发送对象,因此我不必在控制器中实例化任务以将其添加到已完成任务列表中。

public function insertCompletedTask(Request $request)
{
        $task_id = $request->input('task_id');

        $user = \Auth::user();

        $task   = Task::whereId($task_id)->first();
        $update = $user->assignCompletedTask($task);
}

【问题讨论】:

    标签: php laravel view controller


    【解决方案1】:

    您必须通过路由发送 ID

    Route::get('/your-url/{id}', 'YourController@addCompletedTasks');
    

    然后你需要在你的用户模型中声明这个函数:

    public function tasks(){
        return $this->belongsToMany('Task');
    }
    

    然后在你的控制器中有这个功能:

    public function addCompletedTasks($id) {
         // if you want to you can also just do 
         Auth::user()->tasks()->attach($id);
    }
    

    如果您想通过请求中的 POST 而不是通过 URL 中的 ID 发送它,您的函数需要是这样的:

    public function addCompletedTasks(Request $request) {
      Auth::user()->tasks()->attach($request->get('id'));
    }
    

    在任何一种情况下,您都不能发送完整的 php 对象,否则您必须对其进行序列化和反序列化,这样更容易发送 ID。

    但在我看来,您应该首先检查任务是否与 id 相关。但是,如果您在数据库级别上有此控制权,那就没问题了。

    【讨论】:

    • 这正是我正在做的,但我想知道这是否是最好的方法,因为为了实例化我需要查询数据库的任务对象,然后另一个查询来添加它到已完成任务的列表。在性能方面,向表 User_task 中插入一条记录会更快。
    • @Andrew 如果您不想先捕获完整对象,则可以直接执行附加方法。看看我编辑的答案:)
    • 正是我想要的!通过仅将 id 发送到 attach 函数,现在一切都有意义了 :) 非常感谢!
    【解决方案2】:

    如果你返回一个视图,你可以像这样将数据发送回视图:

    return view('view-name',array('variable_view' => $variable));
    

    您将使用数组中的键作为视图中的变量。来自数组 ($variable) 的值是来自控制器的变量。因此,在您的视图中,您将键入 $variable_view,它会使用 $variable,因此您可以将任务对象发送到视图。

    在我看来,我会在视图中使用尽可能少的 PHP。

    【讨论】:

    • 抱歉,我可能没有正确解释我的问题。我知道如何将对象传递给我的视图。但是我希望将我的对象从我的视图传递给控制器​​。所以相反,它正在使用 id 但我想知道如果可以减少之后的查询 nb,我是否不应该传递完整的对象。
    【解决方案3】:

    首先在刀片中创建一个带有隐藏字段的表单

      <form id="sendData" method="POST" action="display_policy">
          @csrf
          <input type="hidden" name="sendOBJ">
      </form>
    

    js 代码是这样的

    function policy_view(obj) {
    console.log(obj);
    $("[name=sendOBJ]").val(JSON.stringify(obj));
    $("#sendData").submit();
    

    }

    在您的 for 循环中,您将对象传递给这个 js 函数,该函数会将您的对象粘贴到隐藏字段并提交表单。然后您可以像这样在控制器中通过请求获取该数据

    public function display_policy(Request $request){
     return   $arrayy = json_decode($request->sendOBJ,false);}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-06
      • 2018-10-29
      • 1970-01-01
      相关资源
      最近更新 更多