Besoin d'aide ?

Trying to get property of non-object

  • Avatar de ThorOddin'sSon
    Membre depuis :
    31/01/2018
    Messages :
    98

    Bonjour,

    J'essais de listé une liste d'exercices avec leurs informations de base, mais j'obtiens le message d'erreur en sujet et je ne vois pas où j'ai fait une erreur.

    Le contrôleur exploité :

    <?php

    namespace App\Http\Controllers;

    use Illuminate\Http\Request;
    use App\Models\Exercises;

    class ExercisesController extends Controller
    {
    /*
    Display a listing of the resource.

    @return \Illuminate\Http\Response
    */
    public function index()
    {
    //$exercises=Exercises::all();
    $exercises = Exercises::with('equipment', 'exercisetype', 'muscle')->get();

    return view('exercises', compact('exercises'));
    }

    Le modèle appeller par le contrôleur :

    <?php

    namespace App\Models;

    use Illuminate\Database\Eloquent\Model;

    class Exercises extends Model
    {
    protected $fillable = [
    'name', 'equipmentid', 'typeid', 'muscleid', 'config', 'guide', 'mediatype', 'mainmedia',
    ];

    function equipment(){
    return $this->belongsTo(Equipment::class);
    }

    function exerciseType(){
    return $this->belongsTo(ExerciseType::class);
    }

    function muscle(){
    return $this->belongsTo(Muscle::class);
    }
    }

    La vue qui fait appel au contrôleur :

    @extends('layouts.app')

    @section('content')
    @foreach($exercises as $exercise)
    <div class="card">
    <div class="card-header">
    <h5 class="card-title">
    <a class="text-dark" href="exercise/{{ $exercise->id }}">{{ $exercise->name }}</a>
    </h5>
    </div>
    <div class="card-body">
    <div class="row">
    <div class="media">
    <?php if( $exercise->mediatype == 0) {?>
    <img class="align-self-center mr-3" src="/images/exercises/{{ $exercise->mainmedia }}" style="width: 320px; height: 320px;">
    <?php }else{ ?>
    <video class="align-self-center mr-3" width="320" height="240" controls>
    <source src="/video/{{ $exercise->mainmedia }}" type="video/mp4">
    </video>
    <?php } ?>
    <div class="media-body">
    <div class="mt-0 row"><p>Équipement :&nbsp;</p>{{ $exercise->equipment->name }}</div>
    <div class="mt-0 row"><p>Type :&nbsp;</p>{{ $exercise->exercisetype->name }}</div>
    <div class="mt-0 row"><p>Muscle principal :&nbsp;</p>{{ $exercise->muscle->name }}</div>
    </div>
    </div>
    </div>
    </div>
    </div>
    @endforeach
    @endsection

    Le schema de la table exercises :

    Schema::create('exercises', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name');
    $table->integer('equipmentid')->unsigned();
    $table->integer('typeid')->unsigned();
    $table->integer('muscleid')->unsigned()->nullable();
    $table->text('config')->nullable();
    $table->text('guide')->nullable();
    $table->integer('mediatype');
    $table->string('mainmedia');
    $table->timestamps();
    $table->foreign('equipmentid')->references('id')->on('equipment')->onDelete('cascade');
    $table->foreign('typeid')->references('id')->on('exercise_types')->onDelete('cascade');
    $table->foreign('muscleid')->references('id')->on('muscles')->onDelete('cascade');
    });

    Où ai-je fait une erreur?

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

    Salut,

    Peut-être le T majuscule dans exerciseType.

  • Avatar de ThorOddin'sSon
    Membre depuis :
    31/01/2018
    Messages :
    98

    Voilà se que la debugbar me renvois comme information :

    select from exercises 4.88ms /app/Http/Controllers/ExercisesController.php:18 db:leveluplifev2
    select
    from equipment where equipment.id in ('') 980μs /app/Http/Controllers/ExercisesController.php:18 db:leveluplifev2
    select from exercise_types where exercise_types.id in ('') 930μs /app/Http/Controllers/ExercisesController.php:18 db:leveluplifev2
    select
    from muscles where muscles.id in ('') 940μs /app/Http/Controllers/ExercisesController.php:18 db:leveluplifev2

    Imgur

  • Avatar de Farris27
    Membre depuis :
    31/10/2017
    Messages :
    66

    pourrais tu copier ton message d'erreur et sinon j'essaierais avec
    Pour le controller

    $exercises = Exercises::with('equipment', 'exerciseType', 'muscle')->get();

    et dans blade :

    <div class="mt-0 row"><p>Type :&nbsp;</p>{{ $exercise->exerciseType->name }}</div>
  • Avatar de ThorOddin'sSon
    Membre depuis :
    31/01/2018
    Messages :
    98

    Voilà le message d'erreur qui ne cesse de faire son aparution bien qu'il y a bien des informations d'insérer dans les quatres tables.
    Imgur

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

    Apparemment ça coince sur $exercise->equipment qui ne retourne rien.

  • Avatar de ThorOddin'sSon
    Membre depuis :
    31/01/2018
    Messages :
    98

    J'ai résolut partiellement le problème.
    Imgur

    J'ai découvert que Laravel exige de nommenclature spécifique pour les noms des tables et certains nom de ligne. Exemple : userid doit être écrit user_id, tout comme mes equipmentid, typeid et muscleid. Là je nages dans le brouillard pour le nouveau problème, car le modèle est identique au modèle equipment.

    Models\Muscle.php :

    <?php

    namespace App\Models;

    use Illuminate\Database\Eloquent\Model;

    class Muscle extends Model
    {
    protected $fillable = [
    'name',
    ];

    protected $table = 'muscles';

    public function exercises()
    {
    return $this->hasMany(Exercises::class);
    }
    }

    Models\Equipment.php :

    <?php

    namespace App\Models;

    use Illuminate\Database\Eloquent\Model;

    class Equipment extends Model
    {
    protected $fillable = [
    'name',
    ];

    protected $table = 'equipment';

    public function exercises()
    {
    return $this->hasMany(Exercises::class);
    }
    }
  • Avatar de Farris27
    Membre depuis :
    31/10/2017
    Messages :
    66

    Saurais tu faire un :

    dd($exercises);

    pour qu'on puisse voir si la relation est faite?

  • Avatar de ThorOddin'sSon
    Membre depuis :
    31/01/2018
    Messages :
    98

    Voilà le résultat :

    Collection {#450 ▼
    #items: array:33 [▼
    0 => Exercises {#379 ▼
    #fillable: array:8 [▼
    0 => "name"
    1 => "equipment_id"
    2 => "type_id"
    3 => "muscle_id"
    4 => "config"
    5 => "guide"
    6 => "mediatype"
    7 => "mainmedia"
    ]
    #connection: "mysql"
    #table: null
    #primaryKey: "id"
    #keyType: "int"
    +incrementing: true
    #with: []
    #withCount: []
    #perPage: 15
    +exists: true
    +wasRecentlyCreated: false
    #attributes: array:11 [▼
    "id" => 1
    "name" => "Rameur Aérobique"
    "equipment_id" => 1
    "type_id" => 1
    "muscle_id" => 6
    "config" => "<ul><li>Enlevez le banc et le bouton de la glissière du siège</li>\<li>Poulies de la barre de tirage</li><li>Poignées</li><li>Attachez les pinces aux tiges de r ▶"
    "guide" => "<ul><li>Gardez votre poitrine levée et conservez un bon alignement de la colonne vertébrale.</li><li>Gardez le pied de stabilité sur le repose-pied.</li></ul>"
    "mediatype" => 0
    "mainmedia" => "aerobicrowing.png"
    "created_at" => "2018-02-07 17:01:18"
    "updated_at" => "2018-02-07 17:01:18"
    ]
    #original: array:11 [▼
    "id" => 1
    "name" => "Rameur Aérobique"
    "equipment_id" => 1
    "type_id" => 1
    "muscle_id" => 6
    "config" => "<ul><li>Enlevez le banc et le bouton de la glissière du siège</li>\<li>Poulies de la barre de tirage</li><li>Poignées</li><li>Attachez les pinces aux tiges de r ▶"
    "guide" => "<ul><li>Gardez votre poitrine levée et conservez un bon alignement de la colonne vertébrale.</li><li>Gardez le pied de stabilité sur le repose-pied.</li></ul>"
    "mediatype" => 0
    "mainmedia" => "aerobicrowing.png"
    "created_at" => "2018-02-07 17:01:18"
    "updated_at" => "2018-02-07 17:01:18"
    ]
    #changes: []
    #casts: []
    #dates: []
    #dateFormat: null
    #appends: []
    #dispatchesEvents: []
    #observables: []
    #relations: array:3 [▼
    "equipment" => Equipment {#416 ▼
    #fillable: array:1 [ …1]
    #table: "equipment"
    #connection: "mysql"
    #primaryKey: "id"
    #keyType: "int"
    +incrementing: true
    #with: []
    #withCount: []
    #perPage: 15
    +exists: true
    +wasRecentlyCreated: false
    #attributes: array:4 [ …4]
    #original: array:4 [ …4]
    #changes: []
    #casts: []
    #dates: []
    #dateFormat: null
    #appends: []
    #dispatchesEvents: []
    #observables: []
    #relations: []
    #touches: []
    +timestamps: true
    #hidden: []
    #visible: []
    #guarded: array:1 [ …1]
    }
    "type" => Type {#451 ▼
    #fillable: array:1 [ …1]
    #connection: "mysql"
    #table: null
    #primaryKey: "id"
    #keyType: "int"
    +incrementing: true
    #with: []
    #withCount: []
    #perPage: 15
    +exists: true
    +wasRecentlyCreated: false
    #attributes: array:4 [ …4]
    #original: array:4 [ …4]
    #changes: []
    #casts: []
    #dates: []
    #dateFormat: null
    #appends: []
    #dispatchesEvents: []
    #observables: []
    #relations: []
    #touches: []
    +timestamps: true
    #hidden: []
    #visible: []
    #guarded: array:1 [ …1]
    }
    "muscle" => Muscle {#500 ▼
    #fillable: array:1 [ …1]
    #table: "muscles"
    #connection: "mysql"
    #primaryKey: "id"
    #keyType: "int"
    +incrementing: true
    #with: []
    #withCount: []
    #perPage: 15
    +exists: true
    +wasRecentlyCreated: false
    #attributes: array:4 [ …4]
    #original: array:4 [ …4]
    #changes: []
    #casts: []
    #dates: []
    #dateFormat: null
    #appends: []
    #dispatchesEvents: []
    #observables: []
    #relations: []
    #touches: []
    +timestamps: true
    #hidden: []
    #visible: []
    #guarded: array:1 [ …1]
    }
    ]
    #touches: []
    +timestamps: true
    #hidden: []
    #visible: []
    #guarded: array:1 [▼
    0 => "*"
    ]
    }
    1 => Exercises {#380 ▼
    #fillable: array:8 [▼
    0 => "name"
    1 => "equipment_id"
    2 => "type_id"
    3 => "muscle_id"
    4 => "config"
    5 => "guide"
    6 => "mediatype"
    7 => "mainmedia"
    ]
    #connection: "mysql"
    #table: null
    #primaryKey: "id"
    #keyType: "int"
    +incrementing: true
    #with: []
    #withCount: []
    #perPage: 15
    +exists: true
    +wasRecentlyCreated: false
    #attributes: array:11 [▼
    "id" => 2
    "name" => "Développé couché"
    "equipment_id" => 1
    "type_id" => 2
    "muscle_id" => 6
    "config" => "<ul><li>Inclinez le banc à 45°.</li><li>Poulies de la barre de tirage</li><li>Poignées</li><li>Attachez les pinces aux tiges de résistance de la Power Rod®.</li ▶"
    "guide" => "<ul><li>Conservez un angle de 90° entre les bras et le torse pendant toute la durée du mouvement.</li><li>Gardez les muscles de votre poitrine contractés.</li>< ▶"
    "mediatype" => 0
    "mainmedia" => "benchpress.png"
    "created_at" => "2018-02-07 17:01:18"
    "updated_at" => "2018-02-07 17:01:18"
    ]
    #original: array:11 [▼
    "id" => 2
    "name" => "Développé couché"
    "equipment_id" => 1
    "type_id" => 2
    "muscle_id" => 6
    "config" => "<ul><li>Inclinez le banc à 45°.</li><li>Poulies de la barre de tirage</li><li>Poignées</li><li>Attachez les pinces aux tiges de résistance de la Power Rod®.</li ▶"
    "guide" => "<ul><li>Conservez un angle de 90° entre les bras et le torse pendant toute la durée du mouvement.</li><li>Gardez les muscles de votre poitrine contractés.</li>< ▶"
    "mediatype" => 0
    "mainmedia" => "benchpress.png"
    "created_at" => "2018-02-07 17:01:18"
    "updated_at" => "2018-02-07 17:01:18"
    ]
    #changes: []
    #casts: []
    #dates: []
    #dateFormat: null
    #appends: []
    #dispatchesEvents: []
    #observables: []
    #relations: array:3 [▼
    "equipment" => Equipment {#416 ▶}
    "type" => Type {#452 ▼
    #fillable: array:1 [ …1]
    #connection: "mysql"
    #table: null
    #primaryKey: "id"
    #keyType: "int"
    +incrementing: true
    #with: []
    #withCount: []
    #perPage: 15
    +exists: true
    +wasRecentlyCreated: false
    #attributes: array:4 [ …4]
    #original: array:4 [ …4]
    #changes: []
    #casts: []
    #dates: []
    #dateFormat: null
    #appends: []
    #dispatchesEvents: []
    #observables: []
    #relations: []
    #touches: []
    +timestamps: true
    #hidden: []
    #visible: []
    #guarded: array:1 [ …1]
    }
    "muscle" => Muscle {#500 ▶}
    ]
    #touches: []
    +timestamps: true
    #hidden: []
    #visible: []
    #guarded: array:1 [▼
    0 => "*"
    ]
    }
  • Avatar de Farris27
    Membre depuis :
    31/10/2017
    Messages :
    66

    un dd de dd($exercises->muscle); stp ?

  • Avatar de ThorOddin'sSon
    Membre depuis :
    31/01/2018
    Messages :
    98

    Hum... sa me sort comme message d'erreur : Property [muscle] does not exist on this collection instance.

    Est-ce qu'il se pourrait que sa soit mes relations que j'ai créé dans mes modèles qui soit responsable du problème?

    Modèle Exercises::class :

    function equipment(){
    return $this->belongsTo(Equipment::class);
    }

    function type(){
    return $this->belongsTo(Type::class);
    }

    function muscle(){
    return $this->belongsTo(Muscle::class);
    }

    Modèle Muscle::class

    public function exercises()
    {
    return $this->hasMany(Exercises::class);
    }

    Est-ce que j'utilise la bonne dénomination de relation ou bien je devrais choisir parmis cette liste?

    1. One To One
    2. One To Many
    3. One To Many (Inverse)
    4. Many To Many
    5. Has Many Through
    6. Polymorphic Relations
    7. Many To Many Polymorphic Relations
  • Avatar de Farris27
    Membre depuis :
    31/10/2017
    Messages :
    66

    On est bien d'accord que un muscle à plusieurs exercices et l'exercice à qu'un seul muscle ?

  • Avatar de Farris27
    Membre depuis :
    31/10/2017
    Messages :
    66

    Essaye de mettre un

    @if(!empty($exercices->muscle)

    @endif

    Je pense qu'il y a l'erreur quand aucun muscle n'est lié au exercices

  • Avatar de ThorOddin'sSon
    Membre depuis :
    31/01/2018
    Messages :
    98

    Bon, j'ai fait un test et voici avec ta suggestion j'ai obtenue se résultat : Property [muscle] does not exist on this collection instance.

    <div class="mt-0 row"><p>Muscle principal :&nbsp;</p>
    @if(!empty($exercise->muscle))
    Aucun muscle principal
    @else
    $exercise->muscle
    @endif
    </div>

    Hier, j'ai essayer de regarder le problème en faisant des tests avec tinker, comme on peut voir, certains exercices parvient à recevoir l'information.

    App\Models\Exercises {#951
    id: 24,
    name: "Développé des jambes en position debout",
    equipment_id: 1,
    type_id: 2,
    muscle_id: 8,
    config: "bla bla bla",
    guide: "bla bla bla",
    mediatype: 0,
    mainmedia: "standinglegkickback.png",
    created_at: "2018-02-07 17:01:18",
    updated_at: "2018-02-07 17:01:18",
    Equipment: App\Models\Equipment {#870},
    Type: App\Models\Type {#816},
    Muscle: App\Models\Muscle {#898
    id: 8,
    name: "Glutes",
    created_at: "2018-02-07 17:01:18",
    updated_at: "2018-02-07 17:01:18",
    },
    },
    App\Models\Exercises {#953
    id: 26,
    name: "Low Impact Cardio Workout for Beginners",
    equipment_id: 6,
    type_id: 1,
    muscle_id: null,
    config: null,
    guide: "10 Min Low Impact Aerobic Workout",
    mediatype: 1,
    mainmedia: "aerobicworkout.mp4",
    created_at: "2018-02-07 17:01:18",
    updated_at: "2018-02-07 17:01:18",
    Equipment: App\Models\Equipment {#868
    id: 6,
    name: "Body Only",
    created_at: "2018-02-07 17:01:17",
    updated_at: "2018-02-07 17:01:17",
    },
    Type: App\Models\Type {#803},
    Muscle: null,
    },
    App\Models\Exercises {#956
    id: 29,
    name: "Brûleur de Calories - Étirement",
    equipment_id: 6,
    type_id: 3,
    muscle_id: null,
    config: null,
    guide: null,
    mediatype: 1,
    mainmedia: "bruleurcalories/03Etirement.mp4",
    created_at: "2018-02-07 17:01:18",
    updated_at: "2018-02-07 17:01:18",
    Equipment: App\Models\Equipment {#868},
    Type: App\Models\Type {#823
    id: 3,
    name: "Étirement",
    created_at: "2018-02-07 17:01:17",
    updated_at: "2018-02-07 17:01:17",
    },
    Muscle: null,
    },

    Chose qui n'arrivait pas avant que je modifie cette ligne :

    $exercises = Exercises::with('Equipment', 'Type', 'Muscle')->get();

    Le fait que j'ai mit le modèle de chaque table en relation avec les exercices avec la première lettre en majuscule, j'ai commencé à voir que certains exercices recevait la valeur lié à la table. J'ai peut-être résolut un tier du problème. Quoi que dans se tier là, le taux de récupération est presque d'un tier.

  • Avatar de ThorOddin'sSon
    Membre depuis :
    31/01/2018
    Messages :
    98

    J'ai résolut finalement. Dans le contrôleur j'ai due faire cela :

    $exercises = Exercises::with('Equipment:id,name', 'Type:id,name', 'Muscle:id,name')->get();

    Ensuite dans ma vue :

    <div class="mt-0 row"><p>Muscle principal :&nbsp;</p>
    @if(is_null($exercise->muscle))
    Aucun muscle principal
    @else
    {{ $exercise->muscle->name }}
    @endif
    </div>

    La variable $exercise->muscle n'était pas vide, mais bien renseigné, la valeur étant placé à Null, s'était pas !empty que je devais placé dans le if, mais is_null. Merci de ton aide Ferris27.

  • Avatar de Farris27
    Membre depuis :
    31/10/2017
    Messages :
    66

    De rien et heureux de voir que ça été résolut ! :)

Vous ne pouvez pas répondre à ce sujet.