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].

Posté il y a 1 an
Avatar de Dom
Dom

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

Posté il y a 1 an
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

Posté il y a 1 an
Avatar de pierrocknroll
pierrocknroll

Peut être en remontant ton with avant le when ?

Posté il y a 1 an
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

Posté il y a 1 an
Avatar de Dom
Dom

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

Posté il y a 1 an

Vous ne pouvez pas répondre à ce sujet.