Lorsqu'elle n'est PAS de tableau croisé dynamique
Dans Laravel nous pouvons configurer les relations de la sorte:
class User {
public function items()
{
return $this->belongsToMany('Item');
}
}
Nous permettant d'obtenir tous les éléments dans un tableau croisé dynamique pour l'utilisateur:
Auth::user()->items();
Cependant que faire si je veux obtenir le contraire de cela. Et obtenir tous les éléments que l'utilisateur N'a PAS encore de. Donc PAS dans le tableau croisé dynamique.
Est-il un moyen simple de faire cela?
- La réponse ci-dessous à partir de Wallace Maxters (stackoverflow.com/a/27742997/2111952), une impression d'être la bonne réponse. Laravel a maintenant whereDoesntHave - vous ne savez pas si il l'a fait quand la question a été demandé d'origine.
Vous devez vous connecter pour publier un commentaire.
Pour des raisons de simplicité et de symétrie, vous pouvez créer une nouvelle méthode dans le modèle de l'Utilisateur:
À utiliser appel:
availableItems
devrait êtrescopeAvailableItems
->lists('user_id')
méthode avec->pluck('user_id)
Regardant le code source de la classe
Illuminate\Database\Eloquent\Builder
, nous avons deux méthodes de Laravel qui fait cela:whereDoesntHave
(en face de lawhereHas
) etdoesntHave
(en face de lahas
)cela fonctionne correctement pour moi!
Pour de simples ", Où n'existe pas de relation", utilisez ceci:
Désolé, ne pas comprendre l'anglais. J'ai utilisé le traducteur de google.
Il n'est pas simple, mais généralement le moyen le plus efficace est d'utiliser une sous-requête.
Si c'était quelque chose que je n'ai souvent que je voudrais ajouter, comme un champ d'application de la méthode de l'Élément de modèle.
Ensuite l'utiliser plus tard comme ce.
->table
avec->from
. Sinon je obtenir un BadMethodCallException Appel à la méthode non Éclairer\Database\Query\Builder::tableau()Comment sur left join?
En supposant que les tables sont
users
,items
etitem_user
trouver tous lesitems
pas associé à l'utilisateur123
:cela devrait fonctionner pour vous
Fini par écrire une portée de cette sorte:
Puis composez le:
Fonctionne pour l'instant, mais un peu en désordre. Voudrais voir quelque chose avec un mot-clé comme
not
:Fondamentalement Éloquent est l'exécution de la requête ci-dessus, de toute façon, sauf avec un
=
au lieu d'un<>
.Peut-être que vous pouvez utiliser:
Source: http://laravel.com/docs/4.2/queries#advanced-wheres