定位一行,而不是所有具有特定值的行

时间:2018-05-06 10:42:03

标签: laravel laravel-5 eloquent

我有一个基本的添加系统,允许房东添加租户,然后租户有能力接受/拒绝。接受非常简单,当租户点击接受时,接受布尔值变为1.此时这会将所有行更改为接受,而不仅仅是房东和租户之间的行。

这是数据库中的示例行:

Row

如果租户点击接受,则接受的行将更改为1,发送的请求将恢复为0.用户现已连接。

但是,所有包含accepted = 0request = 1的行都会受到影响,而不仅仅是当前行。

这是接受的控制器

public function accept(Request $request)
{
    Tenancy::where('accepted', 0)
        ->where('request_sent', 1)
        ->where('tenant_id', Auth::id())
        ->update([
            'accepted' => 1,
            'request_sent' => 0,
        ]);

    return back();
}

有什么想法吗?

修改

路线网址

Route::post('/account/tenancy/{id}/accept', 'AccountController@accept')->middleware('auth');

接受/拒绝的整个表格和逻辑

 @if($currentUser->userType == "Tenant")
                @if($tenancy == null ||$tenancy->accepted == 0 && $tenancy->request_sent == 1 && $tenancy->tenant_id == $currentUser->id)

                    <form method="POST" action="/account/tenancy/{{$user->id}}/accept">
                        {{ csrf_field() }}
                        <input type="submit" class="btn btn-primary" value="Accept Request">
                    </form>
                    <form method="POST" action="/account/tenancy/{{$user->id}}/reject">
                        {{ csrf_field() }}
                        <input type="submit" class="btn btn-warning" value="Reject Request">
                    </form>
@endif

dd($tenancy)

2 个答案:

答案 0 :(得分:0)

你错过了另一个地方。您只是过滤了两个状态和tenant_id,但是您想要按landlord_id进行过滤。

类似于Tenancy::where('accepted', 0)->where('request_sent', 1)->where('tenant_id', Auth::id())->where('landlord_id', $id);

然而,如果房东和房客之间有两个租约,会发生什么?您可能希望在请求中传递租赁ID,并通过id检索accept函数中的租期。在这里要记住的重要一点是确保current user is allowed接受带有他通过的身份的租约。

根据问题中的新代码

修改

这将是我推荐的方法,而不是额外的landlord_id。

<form method="POST" action="/account/tenancy/{{$tenancy->id}}/accept">
    {{ csrf_field() }}
    <input type="submit" class="btn btn-primary" value="Accept Request">
</form>

public function accept(Request $request, $id)
{
    Tenancy::find($id)
        ->update([
            'accepted' => 1,
            'request_sent' => 0,
        ]);

    return back();
}

您还应该记住,需要授权/检查。

答案 1 :(得分:0)

根据您的评论/最近的修改,我认为这应该有效:

全部改变

action="/account/tenancy/{{$user->id}}/accept"

action="/account/tenancy/{{$tenancy->id}}/accept"

和控制器中的accept/reject方法如下:

public function accept(Request $request, string $id)
{
    Tenancy::find($id)
        ->update([
            'accepted' => 1,
            'request_sent' => 0,
        ]);

    return back();
}