繁体   English   中英

检查行是否存在,Laravel

[英]Check if row exists, Laravel

我有以下数据库结构:

items:
id, name, user_id

users table:
id, name

user_favorites table:
id, user_id, item_id

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

如果用户已将其添加到收藏夹中,我希望能够将其替换为“从收藏夹中删除”按钮。

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

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
    }
}

你可能想要这样的东西:

$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
}

我建议你使用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

User_favorite成为访问user_favorites表的模型

$result = User_favorite::where('user_id',Auth::getUser()->id)
                         ->where('item_id',$item->id)
                         ->first();

if (is_null($result)) {
// Not favorited - add new
    User_favorite::create(['user_id'=>Auth::getUser()->id,'item_id'=>$item->id]);
} else {
// Already favorited - delete the existing
    $result->delete();
}

最简单的方法是使用多对多关系的toggle()方法。

例如

$user->roles()->toggle([1, 2, 3]);

多对多关系还提供切换方法,该方法“切换”给定ID的附件状态。 如果当前附加了给定的ID,则它将被分离。 同样,如果它当前已分离,则将附加它

它还返回一个数组,告诉您ID是在DB中附加还是分离。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM