10
votes

Constructeur de requêtes Eloquent Laravel 4 - Jointures complexes avec variable

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`


0 commentaires

5 Réponses :


24
votes

Vous devez passer la variable à la fermeture à l'aide du mot-clé - qui importe la variable dans la portée. Exemple: xxx

Il s'agit d'un problème connexe de la syntaxe PHP et non d'une limitation de Laravel!


7 commentaires

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) 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) . Pour Laravel 3, utilisez dB :: Escape ($ variable) .


Utilisation de PDO :: Quote Défait le but des requêtes paramétrées. Au lieu de cela, voyez ma réponse. À votre santé!



4
votes

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



5
votes

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: xxx

notez l'utilisation de "USER_ID ($ user_id ) "Comme suggéré par @half crached.

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.

Performance: 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.


1 commentaires

Vous devriez changer votre réponse de manière à introduire une vulnérabilité d'injection SQL.



-1
votes

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 et user_id = $ user_id 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: xxx

Toutefois, comme vous le voyez, laissez-vous que la variable $ user_id est sûre parce que nous utilisons \ Db: méthode brute .


1 commentaires

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.



7
votes

Dans la réponse acceptée, il suffit d'ajouter des citations autour du dB :: brut une partie de la requête ne le protégera pas complètement de l'injection SQL . Il suffit de passer des citations dans votre user_id et voyez. Pour paramétrer, vous pouvez faire quelque chose comme ceci: xxx

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 .

Mise à jour : Taylor ajouté Join Where , gauchejoinwherewhere ... Si vous avez une fonction Joindre, il suffit d'utiliser -> où et -> ou du code> de la fermeture. < / p>


1 commentaires

Merci David, ma réponse est assez ancienne. Espérons que les utilisateurs verront cela.