web-dev-qa-db-de.com

Prüfen Sie, ob die Zeile vorhanden ist, Laravel

Ich habe die folgende DB-Struktur:

items:
id, name, user_id

users table:
id, name

user_favorites table:
id, user_id, item_id

Auf meinen Permalink-Seiten für Artikel habe ich die Schaltfläche "Zu Favoriten hinzufügen", mit der eine neue Zeile in user_favorites eingefügt wird.

Ich möchte es für eine Schaltfläche "Aus Favoriten entfernen" ersetzen können, wenn der Benutzer es bereits in seinen Favoriten hat.

Ich kann die Logik dahinter nicht verstehen - muss ich überprüfen, ob in user_favorites eine Zeile mit der ID des aktuellen Benutzers und der Permalink-Element-ID vorhanden ist? Das hat bei mir nicht funktioniert:

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

Vielleicht möchten Sie so etwas:

$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

Ich empfehle Ihnen, exists() oder count() zu verwenden, um first() nicht zu verwenden.

Der schnellste Weg:

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

Oder:

$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

Der schnellere Weg: Nur ID auswählen

$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

Der normale Weg:

$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
19
lijinma

Lassen Sie User_favorite ein Modell sein, das auf Ihre user_favorites-Tabelle zugreift

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

Die einfachste Methode ist die Verwendung der toggle() - Methode der Many-to-Many-Beziehung.

z.B.

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

Die Viele-zu-Viele-Beziehung stellt auch eine Toggle-Methode bereit, die "wechselt" den Anhangsstatus der angegebenen IDs. Wenn die angegebene ID .__ ist. derzeit angeschlossen, wird es getrennt. Ebenso, wenn es aktuell ist freistehend wird es angehängt

Außerdem wird ein Array zurückgegeben, das Ihnen mitteilt, ob die Variable ID in der DB angehängt oder getrennt ist.

0
Amit Gupta