Laravel 5

Relations polymorphic et lazy loading

  • Avatar de AlexandreGerault
    Membre depuis :
    01/10/2019
    Messages :
    3

    Salut tout le monde !

    J'ai un projet avec des relations polymorphiques classiques. Cependant, à un moment donné, je lance une requêtes sur le modèle CompanyData qui est en relation (morphOne) avec le modèle Structure. Seulement, en utilisant le QueryBuilder je n'obtiens qu'une erreur en essayant de charger la relation structure. Je ne comprends ni pourquoi ni comment le résoudre.

    $data = CompanyData::query()
    ->when($customer_min, function ($query, $customer_min) {
    return $query->where('clients_number', '>=', $customer_min);
    })
    ->with('structure')
    ->get();

    J'obtiens alors l'erreur Call to undefined relationship [structure] on model [App\Models\App\CompanyData].

  • Avatar de Dom
    Membre depuis :
    17/07/2017
    Messages :
    37

    Tu as défini la methode structure dans ton model ?
    Tu peux mettre le code de ce model ?

  • Avatar de AlexandreGerault
    Membre depuis :
    01/10/2019
    Messages :
    3

    Bien sûr

    CompanyData.php

    <?php

    namespace App\Models\App;

    use Eloquent;
    use Illuminate\Database\Eloquent\Builder;
    use Illuminate\Database\Eloquent\Model;
    use Illuminate\Support\Carbon;
    class CompanyData extends Model
    {
    /*
    @return mixed
    */
    public function structure () {
    return $this->morhOne(Structure::class, 'data');
    }
    }

    et Structure.php

    <?php

    namespace App\Models\App;

    use Illuminate\Database\Eloquent\Model;
    use Illuminate\Database\Eloquent\Collection;
    use Illuminate\Database\Eloquent\Relations\BelongsToMany;
    use Illuminate\Database\Eloquent\Relations\HasMany;
    use Illuminate\Database\Eloquent\Relations\MorphTo;
    use Illuminate\Database\Eloquent\Builder;
    use Illuminate\Support\Carbon;
    use App\User;
    use Eloquent;

    class Structure extends Model
    {
    /*
    Returns an array of data depending on the structure type

    @return MorphTo
    */
    public function data()
    {
    return $this->morphTo();
    }
    }

    J'ai enlevé tout le code qui ne tient pas aux relations ici mais je peux créer un gist si nécessaire :)

    EDIT : Et voici la migration qui crée la table structures

    public function up()
    {
    Schema::create('structures', function (Blueprint $table) {
    $table->increments('id');
    /*
    Polymorphic relation keys
    */
    $table->integer('data_id')->nullable()->default(null);
    $table->string('data_type');
    });
    }

    Encore une fois je n'ai gardé que le nécessaire pour éviter d'alourdir le post

  • Avatar de pierrocknroll
    Membre depuis :
    12/08/2019
    Messages :
    8

    Peut être en remontant ton with avant le when ?

  • Avatar de AlexandreGerault
    Membre depuis :
    01/10/2019
    Messages :
    3

    Nop, rien ne change. Et ça marche avec des relations One to Many simples

    EDIT : C'est une simple faute de frappe : morphOne au lieu de morhOne

  • Avatar de Dom
    Membre depuis :
    17/07/2017
    Messages :
    37

    Oui crée un gist si tu veux bien que je test ton code

Vous ne pouvez pas répondre à ce sujet.