检查行是否存在,Laravel

2022-08-30 19:29:29

我有以下数据库结构:

items:
id, name, user_id

users table:
id, name

user_favorites table:
id, user_id, item_id

在我的项目永久链接页面上,我有一个“添加到收藏夹”按钮,可以插入一个新行user_favorites

我希望能够将其替换为“从收藏夹中删除”按钮(如果用户已将其放在收藏夹中)。

我无法弄清楚这背后的逻辑 - 我是否需要检查是否存在具有当前用户ID和永久链接项目ID的行?这对我不起作用:user_favorites

if (Auth::user()->id) {
    if (!is_null(DB::table('user_favorites')->where('user_id', '=', Auth::user()->id)->where('item_id', '=', $item->id)->first())) {
        // remove from favorites button will show
    }
}

答案 1

你可能想要这样的东西:

$user_favorites = DB::table('user_favorites')
    ->where('user_id', '=', Auth::user()->id)
    ->where('item_id', '=', $item->id)
    ->first();

if (is_null($user_favorites)) {
    // It does not exist - add to favorites button will show
} else {
    // It exists - remove from favorites button will show
}

答案 2

我建议您使用或检查,而不是使用.exists()count()first()

最快的方法:

$result = DB::table('user_favorites')
    ->where('user_id', '=', Auth::user()->id)
    ->where('item_id', '=', $item->id)
    ->exists();

艺术

$result = DB::table('user_favorites')
    ->where('user_id', '=', Auth::user()->id)
    ->where('item_id', '=', $item->id)
    ->count();

SQL:

select count(*) as aggregate from `user_favorites` where *** limit 1

更快的方法:仅选择ID

$result = DB::table('user_favorites')
    ->where('user_id', '=', Auth::user()->id)
    ->where('item_id', '=', $item->id)
    ->first(['id']);

SQL:

select id from `user_favorites` where *** limit 1

正常方式:

$result = DB::table('user_favorites')
    ->where('user_id', '=', Auth::user()->id)
    ->where('item_id', '=', $item->id)
    ->first();

SQL:

select * from `user_favorites` where *** limit 1

推荐