Comment passer le type et l'id à la relation polymorphe laravel

J'ai un modèle de navigation qui peut être associé à de nombreux éléments :

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use JetBrains\PhpStorm\ArrayShape;
use Laravel\Scout\Searchable;
class Navigation extends Model
{
use HasFactory;
use Searchable;
protected $guarded = [];
public function navigation_items(): HasMany
{
return $this->hasMany(NavigationItem::class);
}
}

Le modèle d'élément de navigation ressemble à ceci

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\MorphTo;
class NavigationItem extends Model
{
use HasFactory;
protected $guarded = [];
public function navigation(): BelongsTo
{
return $this->belongsTo(Navigation::class);
}
public function navigatable(): MorphTo
{
return $this->morphTo();
}
}

Désormais, un élément peut être de type Pageou Blog, dans ce cas, le Pagemodèle ressemble à ceci :

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\MorphOne;
use JetBrains\PhpStorm\ArrayShape;
use Laravel\Scout\Searchable;
class Page extends Model
{
protected $guarded = [];
public function navigatable(): MorphOne
{
return $this->morphOne(NavigationItem::class, 'navigatable');
}
}

Lorsque j'essaie d'enregistrer un modèle de navigation et de l'associer à un élément, l'erreur suivante apparaît :

SQLSTATE[HY000]: General error: 1364 Field 'navigatable_type' doesn't have a default value

J'enregistre le modèle comme ceci:

 foreach ($this->selected as $id) {
$this->navigation->navigation_items()->create([
'navigation_id' => $this->navigation->id,
]);

$this->selectedest l' navigationidentifiant, il devrait automatiquement obtenir le bon navigatable_typeet navigatable_id, mais cela ne semble pas fonctionner.

passer dans le typeet idfonctionne manuellement, mais cela va un peu à l'encontre de l'intérêt d'une relation polymorphe.

des idées?


Solution du problème

Sur le modèle NavigationItem, puisque vous avez défini la relation polymorphe comme "navigatable", on s'attend à ce que la table du modèle NavigationItem contienne navigatable_type et navigatable_id. Veuillez d'abord vous assurer que cela est vérifié.

La création d'enregistrements via la fonction de base de la relation n'est pas une méthode valide. Ce que vous essayez d'y parvenir n'est pas clair, mais lorsque vous souhaitez établir une relation, il existe deux manières standard d'y parvenir :

1- Associé

Lorsqu'une relation est définie comme appartient à, vous pouvez utiliser la fonction associate(). Ainsi:

$account = Account::find(10);

$user->account()->associate($account);

2- Attachez

Attach est utilisé lorsque la relation est définie namesToMany (pivot). Il vous permet de joindre plusieurs enregistrements à une instance/enregistrement de modèle.

$user = User::find(1);

$user->roles()->attach($roleId);

Ainsi, si vous souhaitez définir une "table navigable" sur une instance de navigation, vous pouvez :

$somePageInstance=Page::find(55);
$nagivation->navigatable()->associate($somePageInstance)
$nagivation->save();//remember to save, otherwise it won't be

Commentaires

Posts les plus consultés de ce blog

Erreur Symfony : "Une exception a été levée lors du rendu d'un modèle"

Détecter les appuis sur les touches fléchées en JavaScript

Une chaîne vide donne "Des erreurs ont été détectées dans les arguments de la ligne de commande, veuillez vous assurer que tous les arguments sont correctement définis"