【问题标题】:Inserting id from another table for a hasMany relationship - laravel为 hasMany 关系从另一个表插入 id - laravel
【发布时间】:2019-08-19 10:00:06
【问题描述】:

数据库由两个表组成; 1 个名为 project 的表和 1 个名为 tasks 的表。 一个项目可以有多个任务。 使用多选下拉菜单,可以选择多个元素(用户)并通过数组发送到数据库。

用户的插入工作正常,但项目 ID 插入工作不正常。插入“null”而不是引用项目的 id。

我找不到丢失的东西。感谢您的帮助。

输出:

   array:2 [▼
    0 => array:2 [▼
          "project_id" => null
          "user" => "Jan"
        ]
    1 => array:2 [▼
          "project_id" => null
          "user" => "Piet"
        ]
  ]

项目表

        +----+------+------+-----------------+
        | id | Name | Time |      What       |
        +----+------+------+-----------------+
        | 1  | Test |  123 | Testing project |
        |  2 | Tell |    2 | Knowing project |
        |  3 | Pet  |    5 | Telling pets    |
        +----+------+------+-----------------+

任务表

        +----+------+-----------+
        | id | user | poject_id |
        +----+------+-----------+
        |  1 | Jan  |   1       |
        |  2 | Piet |   1       |
        |  3 | Tom  |   2       |
        +----+------+-----------+

项目.php

public function tasks()
{
    return $this->hasMany('App\Taks', 'project_id');
}

任务.php

public function project()
{

    return $this->belongsTo('App\Project', 'id', 'project_id');
}

ProjectTasksController.php

public function store(Request $request)
{
    $task = new Task();
    $data = $request->all();

    foreach ($request->get('user') as $user){
        $users[] = [
            'project_id' => $request->project_id,
            'user' => $user
        ];
}
dd($users);

show.blade.php

<form action="/projects/{{$project->id}}/tasks" method="post" >
@csrf
<div class="form-group">
    <label for="user">New User</label>
    <select multiple class="form-control" id="multiSelect" name="user[]">
        <option>Jan</option>
        <option>Piet</option>
        <option>Nele</option>
        <option>Tom</option>
        <option>Tony</option>
    </select>
</div>
<div class="form-group">
    <button type="submit" class="btn btn-primary">New user</button>
</div>
</form>

结果 dd($request->all());

array:2 [▼
  "_token" => "xxxx"
  "user" => array:2 [▼
    0 => "Jan"
    1 => "Piet"
  ]
]

web.php

Route::post('/projects/{project}/tasks',    'ProjectTasksController@store');

【问题讨论】:

    标签: php laravel forms foreign-keys


    【解决方案1】:

    您正在通过表单操作 URL 发送项目 ID,您需要在控制器的方法中捕获它。

    public function store(Request $request, $projectID)
    {
        $task = new Task();
        $data = $request->all();
    
        foreach ($request->get('user') as $user){
            $users[] = [
                'project_id' => $projectID,
                'user' => $user
            ];
    }
    

    web.php中,需要添加项目ID参数。

    请在下拉列表中添加一个值。

    <form action="/projects/{{$project->id}}/tasks" method="post" >
    @csrf
    <div class="form-group">
        <label for="user">New User</label>
        <select multiple class="form-control" id="multiSelect" name="user[]">
            <option value="Jan">Jan</option>
            <option value="Piet">Piet</option>
            <option value="Nele">Nele</option>
            <option value="Tom">Tom</option>
            <option value="Tony">Tony</option>
        </select>
    </div>
    <div class="form-group">
        <button type="submit" class="btn btn-primary">New user</button>
    </div>
    </form>
    

    【讨论】:

    • 难道我还有其他事情要做才能发送 project_id 吗?
    • 感谢您的意见。它可以帮助我解决问题。
    【解决方案2】:

    将关系方法替换为以下:

    Task.php

    public function project()
    {
        return $this->belongsTo('App\Project', 'id', 'project_id');
    }
    

    项目模型中的错字:

    Project.php

    public function tasks()
    {
        return $this->hasMany('App\Task', 'project_id');
    }
    

    ProjectTasksController.php

    public function store(Request $request, $project)
    {
    $task = new Task();
    $data = $request->all();
    
    foreach ($request->get('user') as $user){
        $users[] = [
            'project_id' => $project,
            'user' => $user
        ];
    }
    dd($users);
    

    【讨论】:

    • @Nemo 你的表名是什么?并在控制器中添加$request-&gt;all()
    • 我的表名是项目和任务。我将 request all 的结果添加到我的问题中。
    • @Nemo 是 location_name 吗?不是user?它会走上正确的路线吗?
    • 对不起,这是另一个表的输出。我添加了路线。
    • @Nemo 请添加路线。
    【解决方案3】:

    感谢@Nagesh 和@Jinal 的输入,我解决了这个问题。 使用路由模型绑定并使用 store 函数提供 id 以及代码:

        public function store(Request $request, Event $event)
    {
        $location = new Location();
        $data = $request->all();
    
        foreach ($request->get('location_name') as $name){
            $names[] = [
                'event_id' => $event->id,
                'location_name' => $name
            ];
        }
    
        dd($names);
    

    【讨论】:

      猜你喜欢
      • 2014-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-21
      • 1970-01-01
      • 2016-03-13
      相关资源
      最近更新 更多