Partage
  • Partager sur Facebook
  • Partager sur Twitter

Laravel Blade et relation OneToOne (OneToMany)

Sujet résolu
    17 novembre 2018 à 6:12:03

    Bonjour tous le monde.

    Voilà, j'essaie de faire une relation OneToOne(et même OneToMany) puis d'afficher les données avec Blade.

    J'ai donc deux entités: Test et Test2.

    Et c'est Test qui a la clé étrnagère test2_id:

    Mais j'ai l'erreur ci-dessous lors de l'affichage des listes

    Undefined property: stdClass::$test2 



    Voici les codes:

    Creation de la table test:

    <?php
    
    use Illuminate\Support\Facades\Schema;
    use Illuminate\Database\Schema\Blueprint;
    use Illuminate\Database\Migrations\Migration;
    
    class CreateTestTable extends Migration
    {
        /**
         * Run the migrations.
         *
         * @return void
         */
        public function up()
        {
            Schema::create('test', function (Blueprint $table) {
                $table->increments('id');
                $table->timestamps();
                $table->string('name', 100);
                $table->integer('test2_id')->unsigned();
                $table->foreign('test2_id')
    
                      ->references('id')
    
                      ->on('test2');
            });
        }
    
        /**
         * Reverse the migrations.
         *
         * @return void
         */
        public function down()
        {
            Schema::dropIfExists('test');
        }
    }
    

    Creation de la table test2:

    <?php
    
    use Illuminate\Support\Facades\Schema;
    use Illuminate\Database\Schema\Blueprint;
    use Illuminate\Database\Migrations\Migration;
    
    class CreateTest2Table extends Migration
    {
        /**
         * Run the migrations.
         *
         * @return void
         */
        public function up()
        {
            Schema::create('test2', function (Blueprint $table) {
                $table->increments('id');
                $table->timestamps();
                $table->string('nameB', 100);
            });
        }
    
        /**
         * Reverse the migrations.
         *
         * @return void
         */
        public function down()
        {
            Schema::dropIfExists('test2');
        }
    }
    

    Le modele Test:

    <?php
    
    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Test extends Model
    {
        protected $table = 'test';
    
        public $timestamps = false;
    
        protected $fillable = ['name', 'test2_id'];
    
        public function test2() 
    
        {
    
            return $this->belongsTo('App\Test2');
    
        }
    }
    

    Le modele Test2:

    <?php
    
    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Test2 extends Model
    {
         protected $table = 'test2';
    
         public $timestamps = false;
    
         protected $fillable = ['nameB'];
    
         public function test() 
    
    {
    
        return $this->hasOne('App\Test');
    
    }
    }
    

    Le controlleur:

    <?php
    
    namespace App\Http\Controllers;
    
    use Illuminate\Http\Request;
    use App\Test;
    use App\Test2;
    use App\Http\Requests\TestRequest;
    
    class TestController extends Controller
    {
        public function getInfos()
    
        {
    
            return view('test_info');
    
        }
    
    
        public function postInfos(TestRequest $request)
    
        {
    
            $test2 = new Test2;
    
            $input = ['nameB' => 'monNomB'];
    
            $mtest2_id = $test2->create($input)->id;
    
        	$test = new Test;
            $test->test2_id = $mtest2_id;
            $test->name = $request->input('name');
            $test->save();
    
            return redirect('listtest');
    
        }
    
    
        public function list(){
    
            
            $tests = \DB::table('test')->get();
    
            return view('test_ok', compact('tests'));
        }
    
    }
    

    Et le fichier test_ok.blade:

    <!DOCTYPE html>
    <html>
    <head>
    	<title>OK</title>
    </head>
    <body>
    <h1>OK</h1>
    @if(count($tests) > 0)
    	@foreach($tests as $test)
    		<p>Name: {{ $test->name }} - NameB: {{ $test->test2->nameB }}
    	@endforeach
    @endif
    </body>
    </html>

    C'est donc dans l'affichage (dans le fichier test_ok.blade que j'ai le message d'erreur:

    Undefined property: stdClass::$test2 




    Cela fait plusieurs heures que je me démène comme un diable mais je ne trouve pas du tout de solution.

    Quelqu'un peut il m'aider ?



    • Partager sur Facebook
    • Partager sur Twitter
      17 novembre 2018 à 9:48:48

      bonjour

      le message semble explicite:

      il n'y a pas de champs nommé "test2" pour ton objet $test faisant partie de ta liste d'objets "tests"

      • Partager sur Facebook
      • Partager sur Twitter
        17 novembre 2018 à 12:38:47

        C'est là que je ne comprends pas. Selon la documentation et le tuto sur Openclassroom, je suis censé retrouver la classe étrangère à partir de celle liée. Comment puis je faire pour retrouver la liaison lors de l'affichage.

        J'ai trouvé la solution. Je la met ici juste au cas où quelqu'un un jour rencontrera le même problème. Il s'avère que le Query Builder ne permet pas le relationship. Il suffit alors d'utiliser Eloquent ORM pour cela.

        Donc remplacer le code (dans le controlleur) :

        public function list(){
         
                 
                $tests = \DB::table('test')->get();
         
                return view('test_ok', compact('tests'));
            }




        par :

        public function list(){
        
            $tests = \App\Test::all();
        
            return view('test_ok', compact('tests'));
        }



        -
        Edité par alphacol2013 18 novembre 2018 à 1:26:21

        • Partager sur Facebook
        • Partager sur Twitter

        Laravel Blade et relation OneToOne (OneToMany)

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown