我有以下数据库结构:
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
}
}
答案 0 :(得分:34)
你可能想要这样的东西:
$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
}
答案 1 :(得分:20)
我建议您使用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
答案 2 :(得分:1)
最简单的方法是使用多对多关系的toggle()
方法。
e.g。
$user->roles()->toggle([1, 2, 3]);
多对多关系还提供了一种切换方法 “切换”给定ID的附件状态。如果给定的ID是 目前附上,它将被分离。同样,如果它是当前 超然,它将被附加
它还会返回一个数组,告诉您在数据库中是否附加了ID
。