Autour de Laravel

Jointure avec hasmany relationship

Avatar de Bilal
Bilal

Bonjour à tous,

Je cherche un moyen pour joindre un modele dans une requette.

$query = Content::query();
foreach($fields as $field){
                $query->leftJoin($field,  $field.'.content_id', '=', 'contents.id')
                                 ->select('content.*', $field.'.body_value');                                     
 }
 
 $contents = $query->get();

Dans le model Content j'ai cette relation :



class Content extends Model
{
  ...
  ...
  ...
  ...
  
   public function fieldSummaries()
    {
        return $this->hasMany(FieldSummary::class);
    }

}

Pour l'instant quand un contenu a 2 champs FieldSummary par exemple, ça me renvoie ça :

    #original: array:8 [▼
            "id" => 55
            "content_type" => "article"
            "content_id" => 173
            "content_type_field_id" => 111
            "body_value" => "<h1>Lorem ipsum;</h1><div>ellentesque placerat nunc ex, in condimentum nibh porttitor in. Suspendisse vel nisl est. Fusce facilisis turpis eu rutrum cursu</div>
          </pre>
            "
           "body_value" => "<h1>Lorem ipsum;</h1><div>ellentesque placerat nunc ex, in condimentum nibh porttitor in. Suspendisse vel nisl est. Fusce facilisis turpis eu rutrum cursu</div>
          </pre>
            "
            "user_id" => 7
            "created_at" => "2021-06-03 14:41:50"
            "updated_at" => "2021-06-03 14:41:50"
          ]

Ma question y-a-t-il un moyen pour récupérer les différentes valeurs dans la même requette. (avec join et select)

Avatar de bdfi
bdfi

Bonjour, Je ne comprends pas bien la question, difficile sans les définitions partielles des tables, les relations et ce que tu veux faire...

Je ne suis pas un spécialiste SQL, mais utiliser un left join classique devrait te ramener deux records, chacun ayant la même partie Content commune et contenant un des deux fields; donc le content est dupliqué (mais ça peut être ce qu'on veut). Donc pas vraiment ce que tu souhaites.

Tu veux renvoyer à une vue le contenu d'un article Content et de tous les fieldSummary liés ? Si oui, pourquoi pas deux requêtes et l'envoi à la vue via deux variables ?

    $content = Content::find(...)
    $fields  = FieldSummary::where('content_id', $content->id)->orderBy(..., 'asc')->get();
    return view('ma_vue', compact('content', 'fields'));

Ou si on ne veut qu'une variable (ou si c'est une interface), créer la structure à renvoyer en intégrant le tableau de fields dans un content remodelé...

Mais peut-être que je n'ai rien compris :-)

Vous ne pouvez pas répondre à ce sujet.