Laravel 5

Relations polymorphic et lazy loading

Avatar de AlexandreGerault
AlexandreGerault

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
Dom

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

Avatar de AlexandreGerault
AlexandreGerault

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
pierrocknroll

Peut être en remontant ton with avant le when ?

Avatar de AlexandreGerault
AlexandreGerault

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
Dom

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

Vous ne pouvez pas répondre à ce sujet.