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 Page
ou Blog
, dans ce cas, le Page
modè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,
]);
Où $this->selected
est l' navigation
identifiant, il devrait automatiquement obtenir le bon navigatable_type
et navigatable_id
, mais cela ne semble pas fonctionner.
passer dans le type
et id
fonctionne 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
Enregistrer un commentaire