Laravel Eloquent polimórfico um para um?
-
21-12-2019 - |
Pergunta
Estou tentando configurar um relacionamento polimórfico um-para-um (o equivalente polimórfico de has_one e pertence_to). Address
modelo, e tem vários outros modelos que quero que tenham um endereço só.No entanto, estou confuso com o texto dos documentos.Eu vi o morphMany
método, mas minha pergunta é:devo usar morphMany
mesmo que eu queira que tenha apenas um endereço, ou haja algo como um morphOne
método que eu deveria usar?
EDITAR:Meu Address
model possui estes campos, apenas para ajudar a visualizar:
Schema::create('addresses', function ($table)
{
$table->increments('id');
$table->string('street');
$table->string('street_more')->nullable();
$table->string('city');
$table->string('state')->nullable();
$table->string('country');
$table->string('postal_code');
$table->integer('addressable_id');
$table->string('addressable_type');
});
Solução
Sim, existe um morfoOne método e acho que é o que você deve usar neste caso: https://github.com/laravel/framework/blob/5.2/src/Illuminate/Database/Eloquent/Model.php#L811 .
Você também pode usar
$table->morphs('addressable');
em vez de
$table->integer('addressable_id');
$table->string('addressable_type');
Usei o morphOne em um pacote personalizado para L4 e funciona muito bem.
Outras dicas
Experimente este, acho que é melhor do que o morphOne que não é compatível.
public function address()
{
return $this->hasOne('App\Address', 'addressable_id','id')
->where('addressable_type', 'App\Model');
}