Laravel - 检查数据透视表ID是否由发布它的用户“拥有”

时间:2014-11-09 17:21:20

标签: php laravel laravel-4 eloquent pivot-table

我想让所有用户都可以选择从数据透视表中“分离”一行 - alert_criteria,但前提是他们拥有'标准',后者由'数据透视表中的criteria_id'。

关系

  

警报属于多种标准。

     

Criteria areToMany Alerts。

     

用户所属的商标。

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

$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'));

我能想到的唯一漫长的方式是:

  

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

     

获取所有criteria user_id = auth::id

     

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

我很确定我过度复杂,但任何帮助都会非常受欢迎。

1 个答案:

答案 0 :(得分:0)

您可以在criteria_id查询中指定delete范围,以限制查询范围。我正在思考以下几点:

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();
}