Laravel 5.4 尝试仅删除表中的一行-Laravel

Laravel 5.4 尝试仅删除表中的一行-Laravel,laravel-5.4,Laravel 5.4,我正在尝试更新一些用户信息。这是我的密码: public function update(Request $request, $id) { $user = Auth::user(); $user_id = Auth::user()->id; $arrRequest = $request->all(); $contact = Contact::findOrFail($id)->where('user_id', $user_id); $val

我正在尝试更新一些用户信息。这是我的密码:

public function update(Request $request, $id)
{
    $user = Auth::user();
    $user_id = Auth::user()->id;
    $arrRequest = $request->all();
    $contact = Contact::findOrFail($id)->where('user_id', $user_id);
    $validator = Validator::make($arrRequest, Contact::$rules);
    $content = null;

    if ($validator->fails()) {
        $status = 400;
        $content = $validator->errors();
    } else {
        $contact->update($arrRequest)->save();
        $status = 200;
    }

    return response($content, $status);
}
主要的问题是,虽然我指定了要应用请求的行的$id,但请求应用于表中的所有行。我努力想知道我的错误在哪里

第二个问题(刚刚出现)是,当我执行请求时,我现在收到一条消息,上面写着:
调用integer上的成员函数save()
。但它在之前工作得很好(除了更新所有行…)!我正在检索一个对象($contact),而不仅仅是一个整数。。。
谢谢

您正在使用
findOrFail()
方法,该方法返回一个模型或集合

之后,通过在
findOrFail()
结果上附加
where()
方法,将
$contact
转换为生成器对象
findOrFail()
需要$id或$id数组,并返回模型或集合,而不是生成器

如果您只想确保请求的id归用户所有,则可以在获取对象后检查该id,或者使用
findOrFail()
以外的其他方法

虽然我不推荐最后一个,但是只要
$id
就足以获取您想要的物品



第二个错误是在
update()
之后调用
save()
导致的,
update()
将返回一个布尔值。

我终于设法使它工作了。。不过有些奇怪的事情发生了。 以下是我的解决方案:

public function update(Request $request, $id)
    {

    $user = Auth::user();
    $user_id = Auth::user()->id;
    $arrRequest = $request->all();
    $contact = Contact::where('user_id', $user_id)->find($id);
    $validator = Validator::make($arrRequest, Contact::$rules);
    $content = null;

    if ($validator->fails()) {
        $status = 400;
        $content = $validator->errors();
    } else {
        $contact->update($arrRequest);
        $contact->save();
        $status = 201;
    }

    return response($content, $status);
}

多亏了罗伯特,我能理解其中的一些部分。我想如果我先更新()然后保存()(不是在行中),我的保存方法将应用于对象而不是返回的布尔值?这就是它起作用的原因?还在学习啊哈

我已经解决了第二个错误,我正在使用->save()但不需要,仍然很奇怪,我能够在没有任何错误的情况下更早地执行请求。。。。但我仍然无法在某一行上执行请求!更新所有表格…请帮助:谢谢你的回答。这解释了很多!我已经设法让它工作,虽然,看看我的答案,请告诉我,如果它似乎好!(即使它起作用,我可能没有使用正确的东西)您不应该将
find()
firstOrFail()
updateOrCreate()
等方法与查询生成器方法(如
where()
)相结合。。这种方法有效的唯一原因是您对生成器对象调用了
find($id)
。现在它完全忽略了where。打开查询日志或安装类似debugbar的包,以便查看查询。现在,当你试图更新一个不存在的id时,你会得到一个500错误。请看我的第一个例子。好的,谢谢你的反馈@Robert,那么我将学习你的例子!关于错误500,是的,当然,但我只会更新现有的联系人(我在我的应用程序中确保这一点),但再次感谢您的建议!我想你可能误解了我的功能的目的,这里$id与contact_表中的联系人匹配,user_id是用户自己的id。在我的表中,根据当前登录的用户,我会有多个联系人,这两个id不是指同一个人,这就是我的意思:我明白,但是在您的示例中,
where('user\u id',$user\u id)
将被忽略。如果要使用不存在的$id发布到操作,
$contact
将为空。当您的验证成功时,您将调用null上的
update()
,这将触发500个错误。是的,我现在完全知道我的错误:D我将继续努力,如果我再次遇到问题,请与您保持联系:)
$contact = Contact::where('id', $id)
    ->where('user_id', $user->id)
    ->first();

if (! $contact) {
    abort(404);
}
public function update(Request $request, $id)
    {

    $user = Auth::user();
    $user_id = Auth::user()->id;
    $arrRequest = $request->all();
    $contact = Contact::where('user_id', $user_id)->find($id);
    $validator = Validator::make($arrRequest, Contact::$rules);
    $content = null;

    if ($validator->fails()) {
        $status = 400;
        $content = $validator->errors();
    } else {
        $contact->update($arrRequest);
        $contact->save();
        $status = 201;
    }

    return response($content, $status);
}