2015-04-01 100 views
0

这是一个奇怪的问题。laravel关系过滤器查询

什么,我需要做的是过滤掉任何许多到已经连接到当前项目的许多项目

因此,可以说为例子缘故boxtool,我需要一个laravel查询显示所有tools是与当前的box没有关联。问题是该工具可以与不同的box关联,所以即使我可以过滤关系,我也无法保证其他关系可能仍会使tool看起来像它尚未关联。

$data = Tool::select(
    'tools.id', 
    'tools.name', 
    'tool_box.box_id') 
->distinct() 
->join('boxes', 'tools.id', '=', 'tool_box.tool_id') 
->where('tool_box.box_id', '!=', $id) 
->get(); 

这或多或少是我目前正在与打算,它可以过滤一些物品,但如果一个工具与一个以上的框与关联,它失败。

任何想法?

回答

2

这应该让你的所有工具,是不是在你的当前框:

$data = Tool::select(
    'tools.id', 
    'tools.name', 
    'tool_box.box_id') 
->distinct() 
->join('tool_box', 'tools.id', '=', 'tool_box.tool_id') 
->whereNotIn('tools.id', 
    DB::table('tool_box') 
    ->join('tools', 'tools.id', '=', 'tool_box.tool_id') 
    ->where('tool_box.id', '<>', $id) 
    ->lists('tools.id') 
) 
->get(); 
+1

你接近,唯一的问题是,' - >在哪里(“tool_box.id”,“<>” ,$ id)'需要是' - > where('tool_box.id','=',$ id)',因为它需要创建一个值的数组来忽略。另外,由于'tool_box'是一个数据透视表,因此忽略了ID的工具,因此不再有任何加入的理由。谢谢你的帮助,这真的帮助我更多地了解雄辩。 – 2015-04-02 16:58:44