当前位置: 首页 > 知识库问答 >
问题:

请求后使用外键Laravel

钱均
2023-03-14

我使用的是带有vue前端的larvel后端。它们通过API连接。我一直在试图找出如何正确提交与父模型有foreign\u key关系的模型的表单。

这里是关系

  1. 用户有许多任务
  2. 一个任务属于用户
  3. 客户有许多约定
  4. 订婚属于客户
  5. 约定和任务有多对多
  6. 用户和客户没有直接关系

所以我知道,如果我想提交一个帖子请求与用户有关系的数据,分配如下foreign_key很简单

*范例

public function store(Request $request)
    {
        $data = $request->validate([
            'title' => 'required|string',
            'completed' => 'required|boolean',
        ]);
        $todo = Todo::create([
            'user_id' => auth()->user()->id,
            'title' => $request->title,
            'completed' => $request->completed,
        ]);
        return response($todo, 201);
    }

但当我尝试做同样的事情为我的客户端我得到一个500内部服务器错误...

这就是工作流程

在我的vue前端的附加段中。vue组件

<template>
  <div class="page-wrapper mt-1">
    <div class="add-engagement container">
      <div class="card-body bg-light border-primary mb-2">
        <h4 class="text-left text-primary m-0"><i class="mr-3 far fa-folder-open"></i>New Engagement</h4>
      </div>
        <form @submit.prevent="addEngagement" class="d-flex-column justify-content-center">
          <div class="form-group">
            <select class="form-control mb-3" id="type" v-model="engagement.return_type">
              <option v-for="type in types" :key="type.id" :value="type">{{ type }}</option>
            </select>
            <input type="text" class="form-control mb-3" placeholder="Year" v-model="engagement.year">
            <input type="text" class="form-control mb-3" placeholder="Assign To" v-model="engagement.assigned_to">
            <input type="text" class="form-control mb-3" placeholder="Status" v-model="engagement.status">

            <button type="submit" class="btn btn-lg btn-primary d-flex justify-content-start">Create</button>
          </div>
        </form>
      </div>  
  </div>
</template>

<script>


export default {
  name: 'add-engagement',
  data() {
    return {
      engagement: {
        return_type: null,
        year: '',
        assigned_to: '',
        status: '',
      },
      types: [ 
        'Choose Return Type...', 
        '1040', 
        '1120',
      ],
    }
  },
   methods: {
    addEngagement(e) {
      if(!this.engagement.return_type || !this.engagement.year ){
        return
      } else {
        this.$store.dispatch('addEngagement', {
          id: this.idForEngagement,
          return_type: this.engagement.return_type,
          year: this.engagement.year,
          assigned_to: this.engagement.assigned_to,
          status: this.engagement.status,
        })
        e.preventDefault();
      }
      e.preventDefault();
      this.engagement = "" 
      this.idForEngagement++
      this.$router.push('/engagements')
    },
  },
  created: function() {
    this.engagement.return_type = this.types[0]
  },

}
</script>

我捕获输入中的数据,然后将存储分配给addEngments操作

现在在AddEngagement的URL中。vue组件我的客户端id如下所示

add-engagement/{client_id}

这是商店。添加项的js操作

addEngagement(context, engagement) {
      axios.post(('/engagements'), {
        return_type: engagement.return_type,
        year: engagement.year,
        assigned_to: engagement.assigned_to,
        status: engagement.status,
        done: false
      })
      .then(response => {
        context.commit('getClientEngagement', response.data)
      })
      .catch(error => {
        console.log(error)
      })
    },

从这里,它将请求发送到我的Laravel api路由文件中的 /engagement,如下所示

Route::post('/engagements', 'EngagementsController@store');

然后转到EngagementsController运行下面的存储方法

public function store($client_id, Request $request)
    {
        $data = $request->validate([
            'return_type' => 'required|string',
            'year' => 'required|string',
            'status' => 'required|string',
            'assigned_to' => 'required|string',
            'done' => 'required|boolean'
        ]);

        $engagement = Engagement::create([
            'return_type' => $request->return_type,
            'year' => $request->year,
            'assigned_to' => $request->assigned_to,
            'status' => $request->status,
            'done' => $request->done,
            + [
                'client_id' => $client_id
            ]
        ]);

        return response($engagement, 201);
    }

在这一点上,我得到了我的错误,我认为这与$client\u id有关,我尝试了许多不同的格式化方法,但都没有成功。当URL在post请求的前端存储客户端id时,我不知道该数据是如何与laravel共享的,以便它知道客户端id外键将分配给哪个客户端。

共有1个答案

司徒英卓
2023-03-14

首先:

$engagement = Engagement::create([
            'return_type' => $request->return_type,
            'year' => $request->year,
            'assigned_to' => $request->assigned_to,
            'status' => $request->status,
            'done' => $request->done,
            + [
                'client_id' => $client_id
            ]
        ]);

为什么会有这个[...]数组的事情?对我来说没有意义...

但是500服务器错误很可能是由于您的错误请求造成的(大多数500服务器都会这样做)。

如果这是您的路由定义:

Route::post('/engagements', 'EngagementsController@store');

这是方法头:

public function store($client_id, Request $request)

您的发布请求如下:

axios.post(('/engagements'), {
        return_type: engagement.return_type,
        year: engagement.year,
        assigned_to: engagement.assigned_to,
        status: engagement.status,
        done: false
      })

您会注意到,函数定义与路由不同。在函数中,您需要路由未知的参数“client_id”。因此,要解决这个问题,请将您的客户机id放入Post请求正文(例如,在done:false下面),并从函数定义中删除该参数。

 类似资料:
  • 我有一个web应用程序,它有一个Spring集成逻辑,在一个单独的线程中运行。问题是,在某个时候,我的Spring集成逻辑尝试使用请求范围的bean,然后我得到以下错误: 我有ContextLoaderListener设置: 我的作用域Bean是这样注释的(因为我听说代理我的Bean会有帮助): 我所做的可能吗?如果是,我在这里遗漏了什么?如果没有,关于我如何实现这一目标,还有其他建议吗?

  • 我正在尝试向一个创建自己的wifi热点并且只允许http请求的设备发出http请求。对于Android8和更低的http请求是成功的,但是对于Android9它们是失败的。虽然谷歌Pixel2使用的是Android9,但它似乎能发挥作用。 network_security_config.xml

  • 我是WebClient字段的新手,但我遇到了以下问题。这是我的客户端方法,您已经看到它应该插入我发送到数据库参数的值,但我无法插入它。 我在这里写的代码是我的控制器区域。 当我运行我的方法时,我无法将值添加到服务器端的数据库中,但我可以使用以下使用客户端方法的方法从那里获取值。

  • 问题内容: 问题很简单。我想使用Node.js服务器作为代理,以记录,认证HTTP查询并将其转发到后端HTTP服务器(PUT,GET和DELETE请求)。 我应该为此使用哪个库?恐怕找不到。 问题答案: NodeJS支持将http.request作为标准模块:http ://nodejs.org/docs/v0.4.11/api/http.html#http.request

  • 问题内容: 我将Ruby与SQLite3结合使用,但不幸的是,我在Sqlite3中使用外键的尝试均未成功。根据,安装了版本3.7.13。据我所知,Sqlite3从3.6.x版本开始支持外键。 我知道默认情况下外键是禁用的,必须使用来激活。在我的db-create-script Ruby中,我正在执行以下操作: 不幸的是,我可以愉快地将行插入未知的应用程序ID,它可以工作,但当然不行。 有趣的是:直

  • 问题内容: 是否可以使用Python的库发送SOAP请求? 问题答案: 确实有可能。 这是一个使用普通请求lib调用Weather SOAP Service的示例: 一些注意事项: 标头很重要。没有正确的标头,大多数SOAP请求将无法工作。可能是更 正确 使用的标头(但weatherservice更喜欢 这将以xml字符串形式返回响应-然后,您需要解析该xml。 为简单起见,我以纯文本形式包含了该