J'essaie d'apprendre laravel et de faire des tests / applications de démonstration. J'ai du mal maintenant avec les relations laravel / tables éloquentes. Et j'ai besoin de conseils.

J'ai 3 modèles [Application, Term, AppState] et leurs tableaux applications [id, terms_id, appStates_id, et autres cols], terms [id, startDate, endDate,. ..], app_states [id, caption]

Application.php

    public function term()
    {
        return $this->belongsTo('App\Term');
    }
    public function appState()
    {
        return $this->belongsTo('App\AppState');
    }

Dans Term.php et AppState.php j'ai:

    public function applications()
    {
        return $this->hasMany('App\Application');
    }

Comment puis-je obtenir, disons "légende" / "startDay" + "endDate" dans la lame pour chaque application? Je peux obtenir leurs identifiants $app->terms_id / $app->appStates_id dans la boucle foreach, mais je veux obtenir la valeur caption de la table app_states.

Faut-il que ces relations soient également spécifiées dans les migrations? Dans certains cas, il est mentionné que ce n'est pas nécessaire au cas où je voudrais le gérer uniquement en laravel.

Merci du conseil

0
Tomino5 14 avril 2020 à 11:22

2 réponses

Meilleure réponse

Vous pouvez accéder aux valeurs de relation d'un modèle en appelant la méthode de relation comme une propriété.

$application = Application::find(1);

$application->term->startDate;
$application->term->endDate;
$application->appState->caption;

De plus, votre relation avec AppState est fausse, puisque votre clé étrangère ne suit pas une saisie snake_case, vous devrez fournir la clé appropriée pour cela

public function appState()
{
    return $this->belongsTo('App\AppState', 'appStates_id');
}

Vous pouvez également vérifier terms_id car le nom du modèle (Term) est au singulier mais la clé étrangère est au pluriel.

Faut-il que ces relations soient également spécifiées dans les migrations? Dans certains cas, il est mentionné que ce n'est pas nécessaire au cas où je voudrais le gérer uniquement en laravel.

Eh bien, oui, vous n'avez pas besoin de le faire si Laravel sera uniquement celui qui accède à cette base de données. Mais si, dans un proche avenir, vous décidez de migrer vers un autre framework ou d'utiliser la même base de données dans une autre application, il est préférable d'inclure ces relations dans la migration. De plus, un administrateur de base de données ferait probablement grincer des dents si vous ne le faites pas.

0
Julio Motol 14 avril 2020 à 09:10

Donc, à condition que vos relations soient correctement configurées, vous pouvez y accéder partout où vous avez une instance de ce modèle.

Par exemple, disons que vous avez passé une collection d'applications à votre vue ($apps):

@foreach($apps as $app)
    {{ $app->term->startDate }}
    {{ $app->term->endDate }}

    {{ $app->appState->caption }}
@endforeach

Remarque importante: nous accédons à la relation Eloquent en utilisant ->appState plutôt que ->appState(). Ce dernier accède en fait à une instance de Query Builder et présente des cas d'utilisation plus avancés

0
Spholt 14 avril 2020 à 08:51