Besoin d'aide ?

Problème relation OneToMany

Avatar de grafixinfluenz
grafixinfluenz

Bonjour à tous,

Je rencontre actuellement un problème pour mettre en place une relation OneToMany car elle fonctionne à l'envers.

Je m'explique, j'ai une table principale Objects avec un id_categorie qui fait référence à l'id d'une table Categories Chaque objet à une seule catégorie et une catégorie peut être assigné à plusieurs objets. La clé étrangère est en place mais j'ai tout essayé sur les modèles, impossible d'afficher la catégorie correspondant à mon objet dans la boucle. J'ai un ObjetController qui renvoie tous les objets et j'essaye dans cette boucle de créer une seconde boucle pour récupérer la catégorie correspondante mais en vain.

Je commence à me demander si ma démarche est la bonne... Si une bonne âme passe par là je vous en serai très reconnaissant :)

Posté il y a 2 ans
Avatar de khalyomede
khalyomede

Bonjour, j'espère que mon message pourra aider même après si longtemps...

D'après ce que tu décris, pour résumer ta table objects est la suivante :

| id | name         | category_id |
|----|--------------|-------------|
| 1  | Asus ROG     | 1           |
| 2  | iPhone 12    | 2           |
| 3  | PineBook Pro | 1           |

Et ta table de catégorie est la suivante :

| id | name       |
|----|------------|
| 1  | Ordinateur |
| 2  | Smartphone |

Donc en toute logique tu as ces deux migrations, celle des catégories :

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateCategoryTable extends Migration
{
  public function up()
  {
    Schema::create('categories', function (Blueprint $table) {
      $table->id();
      $table->string('name');
      $table->timestamps();
    });
  }

  public function down()
  {
    Schema::dropIfExists('categories');
  }
}

Et celle des objets :

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateObjectsTable extends Migration
{
  public function up()
  {
    Schema::create('objects', function (Blueprint $table) {
      $table->id();
      $table->string('name');
      $table->foreignId('category_id')->constrained();
      $table->timestamps();
    });
  }

  public function down()
  {
    Schema::dropIfExists('objects');
  }
}

Ca signifie que ton modèle Object devra définir la relation comme suit :

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Object extends Model
{
  use HasFactory;

  public function category()
  {
    return $this->belongsTo(Category::class);
  }
}

Et la relation inverse (qui peut toujours servir) sur ton modèle Category :

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
  use HasFactory;

  public function objects()
  {
    return $this->hasMany(Object::class);
  }
}

Et de cette façon dans ton controlleur tu pourras boucler sur tous tes objets, et retrouver leur catégorie :

namespace App\Http\Controllers;

use App\Models\Object;

class ObjectController extends Controller
{
  public function index()
  {
    $objects = Object::with("category")->get();

    foreach ($objects as $object) {
      dd($object->category->name);
    }

    // Retourner la vue...
  }
}

Si ça ne fonctionne pas, vérifie d'abord que ta table à bien la bonne valeur dans la colonne "category_id", et si tu n'a pas nommé cette colonne pareil, vérifie que ta relation spécifie bien le nom de la clé étrangère.

Posté il y a 1 an

Vous ne pouvez pas répondre à ce sujet.