Laravel 5

Jointure sur une base de donnée

  • Avatar de drefusjunior
    Membre depuis :
    23/08/2017
    Messages :
    29

    Salut à tous,
    Aidez moi à réaliser cette requête avec eloquent de laravel.
    Voici la requête:

    $result=$db->query("SELECT exo.id,exo.libelle,exo.surligne,donnee.description as image,question,reponse,lecon.url, lecon.token,lecon.id as lecon_id, modules.id as mid, type_question.id as typeq, type_exo.libelle as typelib FROM donnee,exo,lecon,type_question,type_exo,modules WHERE lecon.id=exo.lecon_id AND exo.type_question_id=type_question.id AND type_exo.id=exo.type_exo_id AND modules.id=lecon.module_id AND lecon_id=".$_GET['le']." GROUP BY exo.id order by exo.id ASC limit 0,1");

    Je suis bloqué sur mon projet.
    Merci

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    1673

    Salut,

    Tu devrais passer du "Aidez-moi" à "Pourriez-vous m'aider ?" étant donné que c'est un forum d'entraide bénévole fondé sur la bonne volonté des participants qu'il ne faudrait pas agacer avec certaines formulations.

    Ceci dit concernant ta demande tu as tous les éléments nécessaires dans la documentation. Il suffit de la lire. Pour te donner un point de départ voici en gros ce que ça devrait être :

    $result = DB::table('exo')
    ->selectRaw('exo.id,exo.libelle,
    exo.surligne,donnee.description as image,
    question,
    reponse,
    lecon.url,
    lecon.token,
    lecon.id as lecon_id,
    modules.id as mid,
    type_question.id as typeq,
    type_exo.libelle as typelib'
    )
    ->join('lecon', 'lecon.id', '=', 'exo.lecon_id')
    ->join('type_question', 'type_question.id', '=', 'exo.type_question_id')
    ->join('type_exo', 'type_exo.id', '=', 'exo.type_exo_id')
    ->join('modules', 'modules.id', '=', 'lecon.module_id')
    ->where('lecon_id', $request->le)
    ->groupBy('exo.id')
    ->orderBy('exo.id', 'asc')
    ->limit(0,1)
    ->get();

    Tel quel ça ne marchera certainement pas parce que j'ai fait ça rapidement mais ça te donne une base.

  • Avatar de watsonweb
    Membre depuis :
    08/02/2017
    Messages :
    83

    Merci pour la reponse donnée à drefusjunior qui m'est utile en ce moment.

  • Avatar de MaitrePylos
    Membre depuis :
    27/05/2013
    Messages :
    101

    Bonjour,

    Après pourquoi ne pas le faire en SQL directement, tant qu'a utiliser DB ?

    $result = DB::select(
    "SELECT exo.id,exo.libelle,exo.surligne,donnee.description as image,question,reponse,lecon.url, lecon.token,lecon.id as lecon_id, modules.id as mid, type_question.id as typeq, type_exo.libelle as typelib FROM donnee,exo,lecon,type_question,type_exo,modules WHERE lecon.id=exo.lecon_id AND exo.type_question_id=type_question.id AND type_exo.id=exo.type_exo_id AND modules.id=lecon.module_id AND lecon_id=? GROUP BY exo.id order by exo.id ASC limit 0,1",[$request->le]
    )->get()
  • Avatar de drefusjunior
    Membre depuis :
    23/08/2017
    Messages :
    29

    salut, j'ai ce code qui marche bien

    $lecons = DB::table('exos')->selectRaw('
    exos.id, exos.libelle, description ,description_hp,
    exos.surligne, question, reponse,
    lecons.token, lecons.id as lecon_id, modules.id as mid, type_questions.id as typeq,
    type_exos.libelle as typelib'

    )->join('lecons', 'lecons.id', '=', 'exos.lecon_id')
    ->join('type_questions', 'type_questions.id', '=', 'exos.type_question_id')
    ->join('type_exos', 'type_exos.id', '=', 'exos.type_exo_id')
    ->join('modules', 'modules.id', '=', 'lecons.module_id')
    ->where('lecon_id', $lecon_id)
    ->orderBy('exos.id', 'asc')
    ->first();

    Mais le soucis c'est lorsque je veux attaqué une autre table que j'ai une erreur :
    Column not found: 1054 Unknown column 'donnees.content' in 'field list'

    $lecons = DB::table('exos', 'donnees')->selectRaw('
    exos.id, exos.libelle, description ,description_hp,
    donnees.content // ligne ajouté
    exos.surligne, question, reponse,
    lecons.token, lecons.id as lecon_id, modules.id as mid, type_questions.id as typeq,
    type_exos.libelle as typelib'

    )->join('lecons', 'lecons.id', '=', 'exos.lecon_id')
    ->join('type_questions', 'type_questions.id', '=', 'exos.type_question_id')
    ->join('type_exos', 'type_exos.id', '=', 'exos.type_exo_id')
    ->join('modules', 'modules.id', '=', 'lecons.module_id')
    ->where('lecon_id', $lecon_id)
    ->orderBy('exos.id', 'asc')
    ->first();
  • Avatar de MaitrePylos
    Membre depuis :
    27/05/2013
    Messages :
    101
    $lecons = DB::table('exos', 'donnees')

    Tu ne peux attaquer qu'une seule table, si tu veux avoir accès à la table donnees, alors tu dois faire un->join('donnees','la jointure qui va bien')

  • Avatar de drefusjunior
    Membre depuis :
    23/08/2017
    Messages :
    29

    je ne comprend pas la jointure qui va bien

  • Avatar de MaitrePylos
    Membre depuis :
    27/05/2013
    Messages :
    101

    Quel est le lien informationelle entre exos et donnees ?

    il y a dans exos un donnees_id ou dans donnes un exos_id ?

  • Avatar de drefusjunior
    Membre depuis :
    23/08/2017
    Messages :
    29

    dans donnes un exos_id

  • Avatar de MaitrePylos
    Membre depuis :
    27/05/2013
    Messages :
    101

    Et une fois cette information acquise, cela ne te fais pas réagir sur la façon de faire avec l'exemple de BestMomo ????

    $lecons = DB::table('exos')->selectRaw('

    exos.id, exos.libelle, description ,description_hp,

    donnees.content // ligne ajouté

    exos.surligne, question, reponse,

    lecons.token, lecons.id as lecon_id, modules.id as mid, type_questions.id as typeq,

    type_exos.libelle as typelib'

    )->join(' donnees', 'exos.id','=','donnes.exos_id')
    ->join('lecons', 'lecons.id', '=', 'exos.lecon_id')

    ->join('type_questions', 'type_questions.id', '=', 'exos.type_question_id')

    ->join('type_exos', 'type_exos.id', '=', 'exos.type_exo_id')

    ->join('modules', 'modules.id', '=', 'lecons.module_id')

    ->where('lecon_id', $lecon_id)

    ->orderBy('exos.id', 'asc')

    ->first();

    Quelque chose dans ce genre là donc.

  • Avatar de drefusjunior
    Membre depuis :
    23/08/2017
    Messages :
    29

    Merci.
    Maintenant si je veux que sa retourne un table je fais ->get() puis je parcour dans la vue avec un foreach.

    Mais quand je fait un get voici l'erreur:
    Property [typelib] does not exist on this collection instance.

    je veux faire le get() parce que je dois afficher des images d'un même exo alors qu'avec un first() j'ai que la premiere image.

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    1673

    Salut,

    Tu as l'erreur dans le foreach de la vue ?

  • Avatar de drefusjunior
    Membre depuis :
    23/08/2017
    Messages :
    29

    Bonjour,
    c'est la boucle que j'ai l'erreur.
    le c'est quoi ?
    le premier exo tombe sur exercice de type image avec 4 images qui dois être afficher et les ce type lorsque je clique sur continuer je dois tomber sur un autre type qui lui n'a pas besoin d'une boucle pour afficher le exercice.
    En gros, il y'a des exos qui ont besoin d'être bouclé et d'autre pas besoin de bouclé.
    voici un peu comment les choses se passe dans ma vu.

    <div class="row">
    @if($lecons->typeq == 2)// exercice de type texte
    <div class="row">
    <div class="description"></div>
    <div class="col-sm-12">

    <div class="col-lg-6 col-md-6 col-xs-6 col-sm-6">
    <div class="_1SfYc _1qCW5">
    <div class="_2GN1p"></div>
    <span class=""><strong class="description">{{ $lecons->question}}</strong></span>
    </div>
    </div>

    <div class="form-group col-lg-6 col-md-6 col-xs-6 col-sm-6">
    <form class="well" autocomplete="off">
    <input type="text" style="height: 5em;" class="form-control" name="phrase" placeholder="Traduis en Français" id="reponseText">
    </form>
    <p class="myadbtn" style="margin-top: 20px;">{{ $lecons->content}}</p>
    </div>

    </div>
    </div>
    <div>
    <input type="hidden" id="hidden" value="{{ $lecons->reponse}}"/>
    <input type="hidden" id="surligne" value="{{ $lecons->surligne}}"/>
    </div>
    @elseif($lecons->typeq == 3) //exercice de type image
    @foreach($lecons as $lecon)
    <div class="row">
    <div class="col-sm-12">
    <div class="col-md-3 col-lg-3 col-sm-3">
    <label>
    <div>
    <img src="{{URL::to('img')}}/{{ $lecons->content}}" id="image" class="describe" valeur="{{ $lecon->description}}" style="margin-bottom: 20px;">
    </div>
    <input type="radio" name="image" class="myradio" myradio="{{ $lecon->description}}" value="{{ $lecon->description}}" valeur="{{ $lecon->description}}">

    <span>{{ $lecon->description}}</span>
    </label>
    </div>
    <input type="hidden" id="hidden" value="{{ $lecon->reponse}}"/><input type="hidden" id="surligne" value="{{ $lecon->surligne}}"/>
    </div>';
    </div>
    @endforeach
    @elseif($lecons->typeq == 4) // image aussi

    @elseif($lecons->typeq == 6) // selection des boutons, plusieurs boutons aussi
    <div class="row">
    <div class="description"></div>
    <span class="toltip"><strong class="description"></strong></span>
    <p><button id="btn"><img style="margin-top:1em" src="{{URL::to('fonts/module1/microphone.png')}}" alt=""></button> <input type="hidden" id="hidden" value="{{ $lecons->reponse}}"/>
    <h2 id="result"><h2>
    </p>
    </div>
    @else
    @endif
    </div>

Vous ne pouvez pas répondre à ce sujet.