web-dev-qa-db-ja.com

行が存在するかどうかを確認します、Laravel

私は次のdb構造を持っています:

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
    }
}
20
O P

次のようなものが必要な場合があります。

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

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
20
lijinma

User_favoriteuser_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();
}
6

最も簡単な方法は、多対多関係の toggle() メソッドを使用することです。

例えば.

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

多対多の関係は、特定のIDの添付ファイルの状態を「切り替える」切り替えメソッドも提供します。指定されたIDが現在アタッチされている場合、デタッチされます。同様に、現在切り離されている場合は、添付されます

また、IDがDBでアタッチまたはデタッチされているかどうかを示す配列を返します。

1
Amit Gupta