我正在开发一个赠品数据库。我有两个主表:
participants
和 giveaways
,具有 N:N 关系,因为参与者可以参与一项或多项赠品,而赠品可以有一名或多名参与者。我的(简化的)表结构如下:
giveaways
----------------------
uuid name
participant_giveaway
----------------------
id giveaway_uuid fiscal_code
participants
----------------------
fiscal_code first_name last_name
现在,我已经遵循了 Laravel 11 的 docs,但这种关系给了我错误的结果。例如,我有 4 个赠品参与者,当我尝试使用
Giveaway::find($uuid)->participants
检索他们时,它会返回 2 个随机参与者,这些参与者链接到另一个赠品。
这是我的
Giveaway
模型。
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Concerns\HasUuids;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Support\Collection;
use Spatie\MediaLibrary\HasMedia;
use Spatie\MediaLibrary\InteractsWithMedia;
class Giveaway extends Model implements HasMedia
{
use HasFactory, InteractsWithMedia, HasUuids;
protected $primaryKey = 'uuid';
protected $fillable = [
'name',
'terms_and_conditions',
'privacy_policy',
'date_start',
'date_end'
];
protected $casts = [
'date_start' => 'datetime',
'date_end' => 'datetime',
];
public function participants(): BelongsToMany
{
return $this->belongsToMany(Participant::class, 'participant_giveaway', 'giveaway_uuid', 'fiscal_code')
->withPivot('drawn', 'code', 'expiration_date', 'status', 'created_at')->withTimestamps();
}
public function drawableParticipants(): Collection
{
return $this->participants()->where('drawn', 0)->get()->pluck('participant');
}
}
这是我的
Participant
模型。
<?php
namespace App\Models;
use Database\Factories\ParticipantFactory;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\HasOne;
use Illuminate\Support\Collection;
class Participant extends Model
{
use HasFactory;
protected $fillable = [
'name',
'date_start',
'date_end'
];
public function giveaways(): BelongsToMany
{
return $this->BelongsToMany(Giveaway::class, 'participant_giveaway', 'fiscal_code', 'giveaway_uuid')
->withPivot('drawn', 'code', 'expiration_date', 'status', 'created_at')->withTimestamps();
}
}
看来问题可能源于您定义关系的方式以及检索参与者的方式。以下是解决此问题的一些建议:
数据透视表配置:确保您的数据透视表 (participant_giveaway) 使用正确的列名称。您当前的定义似乎是正确的,但请仔细检查实际的数据库结构是否与指定的字段匹配。
急切加载:当您检索赠品时,请考虑使用急切加载以确保您获得正确的参与者。查询时使用以下内容:
$giveaway = 赠品::with('参与者')->find($uuid);
pluck 的正确用法:在您的drawableParticipants 方法中,您尝试提取参与者,但可能错误地引用了他们。改为:
public function drawableParticipants(): Collection
{
return $this->participants()->where('drawn', 0)->get();
}
检查 UUID:确保您用于查找赠品的 UUID 正确且对应于正确的参与者。