Laravel 多对多关系给出错误的结果

问题描述 投票:0回答:1

我正在开发一个赠品数据库。我有两个主表:

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();
    }
}

laravel eloquent many-to-many eloquent-relationship
1个回答
0
投票

看来问题可能源于您定义关系的方式以及检索参与者的方式。以下是解决此问题的一些建议:

数据透视表配置:确保您的数据透视表 (participant_giveaway) 使用正确的列名称。您当前的定义似乎是正确的,但请仔细检查实际的数据库结构是否与指定的字段匹配。

急切加载:当您检索赠品时,请考虑使用急切加载以确保您获得正确的参与者。查询时使用以下内容:

$giveaway = 赠品::with('参与者')->find($uuid);

pluck 的正确用法:在您的drawableParticipants 方法中,您尝试提取参与者,但可能错误地引用了他们。改为:

    public function drawableParticipants(): Collection
{
    return $this->participants()->where('drawn', 0)->get();
}

检查 UUID:确保您用于查找赠品的 UUID 正确且对应于正确的参与者。

© www.soinside.com 2019 - 2024. All rights reserved.