我想让所有用户都可以选择从数据透视表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();
}