Bonjour à tous,

Je n'arrive pas à comprendre d'où vient mon erreur...

Ce que je fais

J'ai 2 tables : 1 table "bilan" et 1 table "troubles". Lorsque je valide mon formulaire "troubles" j'ai l'erreur "Method troubles does not exist"
Mes modèles :
Bilan

    public function troubles()
    {
        return $this->hasMany(Trouble::class);
    }

Trouble

    public function bilan()
    {
        return $this->belongsTo(Bilan::class);
    }
}

Mon controller TroubleController :

   public function store(Request $request)
   {

     $dataInput = $request->all();
     $bilan = Bilan::all();
     $trouble = $bilan->troubles()->create($dataInput);

     return view('bilans.show')->with('bilan', $bilan);
   }

Ma vue troubles.index

        <div class="col-md-12"><br>
                    <form class="form-horizontal" role="form" method="POST" action="/troubles">
                        {{ csrf_field() }}

                    <div class="form-group row">
                      <label for="trouble_categorie" class="col-md-4 control-label">Catégorie du trouble</label>
                      <div class="col-md-6">
                        <select id="trouble_categorie" type="dropdown-toggle" class="form-control" name="trouble_categorie" value="" required>
                          <option value="choisir" selected>Choisir</option>
                          <option value="articulaire">Articulaire</option>
                          <option value="musculaire">Musculaire</option>
                          <option value="respiratoire">Respiratoire</option>
                          <option value="cardiaque">Cardiaque</option>
                          <option value="tonus">Tonus</option>
                        </select>
                      </div>
                    </div>

                    <div class="form-group row">
                      <label for="int_trouble" class="col-md-4 control-label">Intensité du trouble</label>
                      <div class="col-md-6">
                        <select id="trouble_intensite" type="dropdown-toggle" class="form-control" name="trouble_intensite" value="{{ old('trouble_intensite') }}" required autofocus>
                          <option value="choisir" selected>Choisir</option>
                          <option value="tfaible">Très faible</option>
                          <option value="faible">Faible</option>
                          <option value="normale">Normale</option>
                          <option value="elevee">Elevée</option>
                          <option value="televee">Très élevée</option>
                        </select>
                      </div>
                    </div>

                <button type="button" class="btn btn-default" data-dismiss="modal">Fermer</button>
                <button type="submit" class="btn btn-primary">Enregistrer</button>
             </form>
        </div>

Ce que je veux

Dans mon controller, si je remplace Bilan::all(); par Bilan::first(); ça marche, la validation se fait et ma table troubles se peuple, mais avec le 1er bilan_id et non celui en cours (c'est celui là que je veux récupérer)...
J'ai beau me creuser la tête, je ne comprends pas ce qui cloche...
Votre aide me serait d'une grande utilité !

4 réponses


Spiker
Réponse acceptée

Hello normal que ça ne marche pas, ton $bilan contient tout t'es bilans, du coup il ne sait pas sur lequelle lui attacher un trouble.

Normalement tu devrais faire une route nesté :

/bilans/{id}/troubles/create

Car un trouble appartient à un bilan.
Comme ça lorsque tu envera ton formulaire tu pourras faire:

   public function store(Bilan $bilan, Request $request)
   {
     $dataInput = $request->all();
     $trouble = $bilan->troubles()->create($dataInput);

     return view('bilans.show')->with('bilan', $bilan);
   }

Tu pourras récuperer $bilan via le model binding:
https://laravel.com/docs/5.4/routing#route-model-binding

Merci Spiker pour ta réponse. Mais alors si je crée une route
J'ai essayé :
Route::get('bilans/{id}/troubles/create', 'TroubleController@store')->name('troubles.store');
la table se peuple mais je ne récupère pas le bilan_id... (j'ai un NULL à la place)

puis J'ai essayé ça comme dans le lien que tu m'as envoyé :
Route::get('bilans/{id}/troubles/create', function (App\Bilan $bilan) {
return $bilan->id;
});
là j'ai cette erreur :
SQLSTATE[HY000] [1862] Your password has expired. To log in you must change it using a client that supports expired passwords. (SQL: select * from users where users.id = 1 limit 1)

Faut-il que je la crée dans mon BilanController au lieu du TroubleController ? mais du coup j'ai déjà une fonction store dans le BilanController. Je l'appelle createTrouble ?

et maintenant je n'ai plus accès à phpmyadmin depuis la dernière manip, j'ai un "connexion au serveur MySQL non permise"...

Vu mon inexpérience, j'ai passé le week-end à essayer de comprendre mon erreur qui n'a finalement rien à voir avec la route.
Je parle des erreurs :
SQLSTATE[HY000] [1862] Your password has expired. To log in you must change it using a client that supports expired passwords. (SQL: select * from users where users.id = 1 limit 1)
et
'connexion au serveur MySQL non permise' sur phpmyadmin
Ces erreurs, pour ceux que ça pourrait intéresser vient en fait d'une restriction de MySQL qui limite l'utilisation du mot de passe à 1 an. ça devait faire 1 an et 1 jour que j'avais installé wamp sur ma machine et du coup il me fallait modifier le mot de passe MySQL.
Pfff.... Quand on le sait ça va mieux !