我有 5 个表,名为 Users、Chats、Buletins、Hartas 和 Owners。所有这些表都通过名为 Mediaables 的数据透视表与另一个名为 Medias 的表存在多对多关系。
我需要使用多态关系,因为所有这 5 个表都将使用相同的 Mediaables 表来存储它们与 Medias 表的关系。
对于这个主题,让我分享我在各自模型文件中定义的 Buletins、Medias 和 Mediable 多态关系。我还将共享 Mediables tablemy controller 的迁移文件
公告型号:
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\MorphToMany;
class Buletin extends Model
{
public function user()
{
return $this->belongsTo(User::class);
}
public function medias(): MorphToMany
{
return $this->morphToMany(Media::class, 'mediable');
}
}
媒体模型:
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\MorphToMany;
class Media extends Model
{
public function buletins(): MorphToMany
{
return $this->morphedByMany(Buletin::class, 'mediable');
}
}
中介模型:
class Medialink extends Model
{
// no relation defined
}
中等迁移:
public function up()
{
Schema::create('mediables', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('media_id');
$table->foreign('media_id')->references('id')->on('medias')->onDelete('cascade');
$table->unsignedBigInteger('mediable_id');
$table->string('mediable_type');
$table->timestamps();
});
}
在控制器文件中:
public function showbuletin ($id)
{
$buletins = Buletin::where('id', $id)->orWhere('comment_id', $id)->paginate(5);
return view('layouts.buletin.show-bbs')->with(compact('buletins'));
}
在 show-bbs.blade.php 中,我设法在 foreach 循环($buletins 为 $buletin)中回应了所有这些:
{{ $buletin->user->name }} // Buletin belongsTo User & User hasMany Buletin
{{ $buletin->messages }}
{{ $buletin->created_at }}
问题是,我没能回应这个:
{{ $buletin->medias }} // gives me "[]" on the display
请帮助我。
已经得到了这个问题的答案。问题在于我如何将 mediable_type 保存在我的 mediables 表中。以下是我如何保存它以使其正常工作:
控制器文件:
// store new buletin_media in mediables table
if ($request->media_id) {
foreach ($request->media_id as $key => $value) {
Mediable::create([
'media_id' => $value,
'mediable_id' => $buletin->id,
'mediable_type' => Buletin::class,
]);
}
}
我必须保存确切的 Buletin 模型才能使其正常工作。