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