recherche

Maison  >  Questions et réponses  >  le corps du texte

Dans Eloquent, la méthode « with » dans la relation HasMany renvoie une collection vide.

J'ai rencontré ce problème : j'ai défini une relation HasMany entre deux modèles comme ceci :

DepartamentoPersonalizado.php:

<?php

namespace AppModels;

use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentRelationsHasMany;
use AppModelsLocalidadPersonalizada;

class DepartamentoPersonalizado extends Model
{
    use HasFactory;
    protected $table = 'departamentos_personalizados';
    //I've tried:
    //protected $with = ['localidades'];

    public function localidades ():HasMany {
        return $this->hasMany(LocalidadPersonalizada::class,'departamento_id');
    }

}

LocalidadPersonalizada.php :

<?php

namespace AppModels;

use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateDatabaseEloquentModel;
use AppModelsDepartamentoPersonalizado;

class LocalidadPersonalizada extends Model
{
    use HasFactory;
    protected $table = 'localidades_personalizadas';
    
    
    public function departamento () {
          return $this->belongsTo(DepartamentoPersonalizado::class,'id');
    }
    
}

Quand je fais ce qui suit dans Tinker :

> use AppModelsDepartamentoPersonalizado;
> $departamentos= DepartamentoPersonalizado::all()->first()->localidades;

Je reçois :

= IlluminateDatabaseEloquentCollection {#6778
    all: [
      AppModelsLocalidadPersonalizada {#6780
        nombre_localidad: "General San Martin",
        departamento_id: "06371",
        id: 1,
      },
      AppModelsLocalidadPersonalizada {#6781
        nombre_localidad: "Villa Lynch",
        departamento_id: "06371",
        id: 2,
      },
      AppModelsLocalidadPersonalizada {#6782
        nombre_localidad: "Villa Maipu",
        departamento_id: "06371",
        id: 3,
      },
      AppModelsLocalidadPersonalizada {#6783
        nombre_localidad: "Villa Ballester",
        departamento_id: "06371",
        id: 4,
      },
...

Mais :

> $departamentos = DepartamentoPersonalizado::with('localidades')->get();

J'ai eu

= IlluminateDatabaseEloquentCollection {#6770
    all: [
      AppModelsDepartamentoPersonalizado {#6771
        departamento_datos_gob: "Ciudad Libertador San Martin",
        departamento_osm: "General San Martin",
        id_provincia: "06",
        id: "06371",
        reemplazar_agregar: 0,
        localidades: IlluminateDatabaseEloquentCollection {#6765
          all: [],
        },
      },
      AppModelsDepartamentoPersonalizado {#6767
        departamento_datos_gob: "La Matanza",
        departamento_osm: "La Matanza",
        id_provincia: "06",
        id: "06427",
        reemplazar_agregar: 1,
        localidades: IlluminateDatabaseEloquentCollection {#6790
          all: [],
        },
      },
    ],
  }

Je veux dire, la propriété 'localidades' renvoie une collection vide, alors que je veux qu'elle contienne une collection imbriquée.

Je souhaite utiliser 'protected $with = ['localidades']' dans DepartamentoPersonalizado pour obtenir les résultats que je souhaite par défaut.

Qu'en pensez-vous ? Besoin d'informations complémentaires ?

P粉143640496P粉143640496525 Il y a quelques jours605

répondre à tous(1)je répondrai

  • P粉087951442

    P粉0879514422023-07-20 15:59:14

    Étant donné que l'"id" dans ma table "departamentos_personalizados" est une chaîne et non un entier, je dois procéder comme suit :

    <?php
    
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Factories\HasFactory;
    use Illuminate\Database\Eloquent\Model;
    use Illuminate\Database\Eloquent\Relations\HasMany;
    use App\Models\LocalidadPersonalizada;
    
    class DepartamentoPersonalizado extends Model
    {
        use HasFactory;
        protected $table = 'departamentos_personalizados';
        public $incrementing=false;
        protected $with = ['localidades'];
        protected $casts=['reemplazar_agregar' => 'boolean'];
    
        public function localidades ():HasMany {
            
            return $this->hasMany(LocalidadPersonalizada::class,'departamento_id','id');
        }
    
    }

    C'est ça

    répondre
    0
  • Annulerrépondre