J'essaie de reproduire une jointure comme si vous utilisez le constructeur de requêtes LARAVEL:
left join `content_userdata` on `content_id` = `content`.`id` and `user_id` = `10`
5 Réponses :
Vous devez passer la variable à la fermeture à l'aide du mot-clé code> code> - qui importe la variable dans la portée. Exemple: Il s'agit d'un problème connexe de la syntaxe PHP et non d'une limitation de Laravel! P> p>
Les acclamations qui fixent le point 1 mais qu'en est-il du point 2 qui est une limitation de la larançue?
Vous auriez besoin d'utiliser dB :: brut ($ user_id) code> dans ce cas :)
Je suis inquiet pour l'injection SQL si j'utilise cette méthode. Y a-t-il des moyens d'éviter cela?
@Benjaminoman pour protéger contre l'injection SQL, échapper à la valeur avec IntTval ($ user_id).
C'est une bonne idée, mais si la valeur est une chaîne? Par exemple, si l'user_id est un UUID alphanumérique?
Pour Laravel 4, utilisez dB :: getpdo () -> citation ($ variable) code>. Pour Laravel 3, utilisez
dB :: Escape ($ variable) code>.
Utilisation de PDO :: Quote Code> Défait le but des requêtes paramétrées. Au lieu de cela, voyez ma réponse. À votre santé!
Pourquoi ne faites-vous pas simplement utiliser des relations? C'est tout le point d'un orm comme Eloquant ?
quelque chose comme ça; P >
$place = new Place; $array = $place->with('users')->where('user_id', $user_id)->get(); var_dump($array->toArray());
Êtes-vous capable de définir un supplément où lors de l'utilisation de HASONE telle que: $ ceci->> où ("user_id ', $ user_id) -> hasone (" userData'). Sinon, je ne suis pas sûr de savoir comment cela résout le problème réel de pouvoir sélectionner par un utilisateur spécifique.
Oui, vous pouvez inclure des requères sur les relations - laravel.com/docs/eloquent#quererying-Relations a>
Ce lien n'implique pas que vous pouvez le faire dans la manière dont j'ai dit ou d'une manière qui serait utile dans ce cas? Je ne suis toujours pas sûr que vous ayez lu la question ou que vous avez compris le problème correctement, en particulier le peu après «pourquoi voudrais-je faire cela», néanmoins, j'ai déjà posté et accepté la bonne réponse maintenant.
Une jointure est simplement une relation. Les relations de l'éloquent gèrent toutes les jointures pour vous. Vous pouvez inclure des requéres sur jointures - comme ma réponse éditée ci-dessus. Il fait exactement ce que vous voulez, inclure les résultats de retour sans relation - résolvant ainsi votre «pourquoi je veux le faire».
J'ai réussi à résoudre ce moi-même, il y a une note en bas de la raison pour laquelle ce n'est pas complètement optimal, mais voici comment le faire quand même: notez l'utilisation de "USER_ID ($ user_id ) "Comme suggéré par @half crached. p> dB :: brut () est utilisé pour envelopper $ user_id dans des guillemets, même s'il s'agit d'un entier et non d'une chaîne. Cela arrêtera le Laravel à l'aide de «ce qui le rend la mysql l'interpréter comme un nom de colonne. P> Performance: strong> Une chose à noter est que les requêtes MySQL peuvent être considérablement plus rapides lors de l'utilisation d'un entier plutôt qu'une chaîne et l'interprétera comme une chaîne si elle est enveloppée dans des citations. Je ne m'inquiète pas pour le moment, mais je pensais que je devrais le mentionner si d'autres utilisent cela comme une solution. P> P>
Vous devriez changer votre réponse de manière à introduire une vulnérabilité d'injection SQL.
Votre premier problème: vous devez utiliser la syntaxe PHP pour la fermeture comme réponse de HIGH DIM-.
À propos de votre deuxième problème, je pense que la partie Toutefois, comme vous le voyez, laissez-vous que la variable et user_id = $ user_id code> de la requête n'appartient pas à une clause de jointure mais une clause WHERE, car elle dépend simplement d'une table, pas à la fois dans cette relation de jonction. Je pense que vous devriez utiliser une sous-requête comme ceci:
$ user_id code> est sûre parce que nous utilisons
\ Db: méthode brute code>. P> p>
J'ai déjà répondu à la possibilité d'utiliser un lieu où dans la question, expliquant pourquoi il doit être dans la jointure. Je l'ai également compris et j'ai répondu à ma propre question mais je ne suis pas autorisé à l'accepter pendant 8 heures apparemment.
Dans la réponse acceptée, il suffit d'ajouter des citations autour du Avis dans cet exemple que vous n'avez pas à transmettre la variable dans la fermeture. Sinon, vous pouvez essayer d'écrire cette partie Complètement RAW . P> dB :: brut code> une partie de la requête
Join Where code>,
gauchejoinwherewhere code> ... Si vous avez une fonction Joindre, il suffit d'utiliser
-> où code> et
-> ou du code> de la fermeture. p> < / p>
Merci David, ma réponse est assez ancienne. Espérons que les utilisateurs verront cela.