Laravel-检查数据透视表ID是否为';拥有';由用户发布


Laravel - Check if pivot table ID is 'owned' by the user posting it

我想让所有用户都可以选择从数据透视表alert_criteria中"分离"一行,但前提是他们拥有数据透视表中由"criteria_id"链接的"criteria"。

关系

警报属于多个条件。

属于多个警报的条件。

用户属于多个条件。

他们目前正在通过以下途径查看数据透视表的数据:

$matches = Criteria::whereUserId( Auth::id() )
        ->has('alerts')
        ->get();

我希望他们能够从数据透视表中删除他们的行中的任何一行。

在我的视图中,我可以访问每个数据透视表行的ID,并通过发布到控制器

{{ Form::open(array('route' => array('archiveMatch', $alert->id), 'role'=>'form')) }}
    @foreach($matches as $match)
        @foreach($match->alerts as $alert) 
            {{$alert->id}}
        @endforeach
    @endforeach
{{ Form::close() }}

我最初想到的是:

public function postArchiveMatch($id)
    {
        DB::delete('delete from alert_criteria where id = ?' , array($id));
    }

但是,我想检查用户是否真的拥有这个数据透视表行。据我所知,任何知道这个URL的人都可以删除透视表行,即使他们不拥有"标准":

  Route::post('users/match/destroy/{id}', 
    array('as' => 'archiveMatch', 'uses' => 'UsersController@postArchiveMatch'));

我唯一能想到的长篇大论的方法是:

获取与alert_criteria.id相关的criteria_id。(来自表单帖子)。

获取所有criteria,其中user_id=auth::id

检查"criteria_id"是否在列表中。如果不是,那就意味着用户不拥有它

我很确定我已经把事情复杂化了,但任何帮助都将不胜感激。

您可以在delete查询中指定一个criteria_id的范围来限制查询的范围。我想的是:

public function postArchiveMatch($id)
{
    $myCriteriaIds = Db::table('criteria')->select('id')
                                          ->where('user_id', '=', Auth::id())
                                          ->get()
                                          ->toArray();
    $myCriteriaIds = explode(',', $myCriteriaIds);
    DB::table->('alert_criteria')
             ->where('id', $id)
             ->where('criteria_id', 'IN', $myCriteriaIds)
             ->delete();
}