Stworzyłem coś takiego. Czy ma to ręce i nogi i jest w porządku? W przyszłości chcę mieć możliwość dodania jakichś nowych reakcji, dlatego taka forma tego. No i Reagować będzie można na wiele modeli. Wcześniej w takie relacje się nie bawiłem (no, może trochu z tagami).
<?php
namespace App\Traits;
use App\Models\React;
use Illuminate\Database\Eloquent\Relations\MorphToMany;
trait ReactTrait
{
public function reacts(): MorphToMany
{
return $this->morphToMany(React::class, 'reactable');
}
}
<?php
namespace App\Contracts;
use Illuminate\Database\Eloquent\Relations\MorphToMany;
interface Reactable
{
public function reacts(): MorphToMany;
}
<?php
namespace App\Models;
class Post extends Model implements Reactable
{
use BroadcastsEvents, HasFactory, ReactTrait;
<?php
namespace App\Models;
class React extends Model
{
use HasFactory;
public function reactable()
{
return $this->morphTo();
}
}
Schema::create('reacts', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->timestamps();
});
Schema::create('reactables', function (Blueprint $table) {
$table->foreignId('user_id')->constrained()->onUpdate('cascade')->onDelete('cascade');
$table->foreignId('react_id')->constrained()->onUpdate('cascade')->onDelete('cascade');
$table->integer('reactable_id');
$table->string('reactable_type');
$table->timestamps();
});
Jeśli coś można zrobić lepiej - poproszę rady, a jeśli to jest ok - to w jaki sposób mogę wyświetlić wszystkie lub dla konkretnego modelu reakcje danego usera?