Laravel - 合并两个表,然后根据where查询删除条目

时间:2017-09-13 08:57:37

标签: laravel sqlite

我有一个水果数据库,让我说我想要它的所有红色水果:

$allfruit = DB::table('fruits')->Where("color","=","red")->paginate(10);

我还有一张用户最不喜欢的水果表。如果用户已登录,我正试图通过他们的ID获取所有他们讨厌的水果的列表:

$leastfav = DB::table('dislikes')->Where("userID","=",Auth::user()->id)->get();

现在我要做的就是删除“不喜欢”表格中显示的$allfruit中包含该用户ID的所有条目。

我尝试过的是:

$allfruit = DB::table('fruits')->Where("color","=","red")->merge($leastfav)->where(fruits.ID,"!=", "dislikes.fruitID")->paginate(10);

如果有帮助,我的数据库是SQLite。感谢

1 个答案:

答案 0 :(得分:1)

您可以使用whereNotExistswhereExists()的倒数):

$allfruitQuery = DB::table('fruits')->where('color', 'red');

if (auth()->check()) {
    $allfruitQuery->whereNotExists(function ($query) {
        $query->select(DB::raw(1))
            ->from('dislikes')
            ->where('userID', auth()->id())
            ->whereRaw('fruits.ID = dislikes.fruitID');
    });
}

$allfuit = $allfruitQuery->paginate(10);

或者,(如果您使用的是5.2+),您可以使用when()

$allfuit = DB::table('fruits')->where('color', 'red')
    ->when(auth()->check(), function ($query) {
        $query->whereNotExists(function ($query) {
            $query->select(DB::raw(1))
                ->from('dislikes')
                ->where('userID', auth()->id())
                ->whereRaw('fruits.ID = dislikes.fruitID');
        });
    })
    ->paginate(10);

希望这有帮助!