After a while trying some stuff, this approach worked for me:
App\Models\DatosContacto.php:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use App\Models\Alquiler;class DatosContacto extends Model {
use HasFactory;protected $guarded = [];
public $timestamps = false;
protected $table = 'datos_contacto';
protected $hidden = ['tipo_usuario','alquiler_id'];
public function alquiler() {
return $this->belongsTo(Alquiler::class, 'alquiler_id');
}
}
App\Models\ContratadorContacto.php:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use App\Models\Alquiler;
use App\Models\DatosContacto;class ContratadorContacto extends DatosContacto {
}
App\Models\PublicadorContacto.php:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use App\Models\Alquiler;
use App\Models\DatosContacto;class PublicadorContacto extends DatosContacto {
}
App\Models\Alquiler.php:
<?php
namespace App\Models;
(...)
use App\Models\DatosContacto;
use App\Models\PublicadorContacto;
use App\Models\ContratadorContacto;(...)
class Alquiler extends Model {
protected $appends = ['reputacion', 'ambientes', 'datosContacto'];
(...)
public function datosContacto() {
return $this->hasMany(DatosContacto::class, 'alquiler_id');
}public function publicadorContacto() {
return $this->hasOne(PublicadorContacto::class, 'alquiler_id')
->where('tipo_usuario', 'publicador');
}public function contratadorContacto() {
return $this->hasOne(ContratadorContacto::class, 'alquiler_id')
->where('tipo_usuario', 'contratador');
}public function getDatosContactoAttribute() {
if ($this->disponible) return null;if (!$this-\>publicadorContacto() || !$this-\>contratadorContacto()) return null; return (object)\[ 'publicadorContacto' =\> $this-\>publicadorContacto, 'contratadorContacto' =\> $this-\>contratadorContacto, \];}
(...)
}
My tinker result, when I do Alquiler::find(37) is like this:
+datosContacto: {#6836
+"publicadorContacto": App\Models\PublicadorContacto {#6713
id: 55,
#tipo_usuario: "publicador",
email: "[email protected]",
horario_atencion: "24x7",
telefono: "11-3546-5888",
telefono_alt: "4701-1108",
celular: "11-3546-5888",
whatsapp: "(54) 11-3546-5888",
#alquiler_id: 37,
},
+"contratadorContacto": App\Models\ContratadorContacto {#6755
id: 54,
#tipo_usuario: "contratador",
email: "[email protected]",
horario_atencion: "24x7",
telefono: "11-3233-9668",
telefono_alt: "5325-1372",
celular: "11-3233-9668",
whatsapp: "(54) 11-3233-9668",
#alquiler_id: 37,
},
},
Thank a lot for your suggestions!
Best regards
Leandro