Laravel 8:如何创建具有关联迁移的Pivot模型?

3
我想创建一个模型:FormsUser和迁移:forms_user。
为了使用该表作为枢轴表,因为我在创建表单时遇到问题,我被告知表“forms_users不存在”,因为我单独创建了迁移。当我转到我的小组成员管理页面时,我会收到错误:“forms_users不存在”,因为我必须使用一个枢轴表,所以它必须具有这个表名...
你能帮我解决这个问题或提供替代方案吗? 简而言之,我想创建一个表单,并创建一个团队,可以向其中添加其他用户以填写相同的表单。
Migration: forms && Models Forms:
class Forms extends Model
{
    use HasFactory;
    use SoftDeletes;

    protected $fillable = [
        'title',
        'description',
        'date',
        'color',
        'progress',
        'user_id',
        'groupe_id',
        'formulaire',
        'logo',
    ];

    protected $dates = [
        'created_at',
        'deleted_at',
        'started_at',
        'update_at'
    ];

    public function user()
    {
        return $this->belongsTo(User::class);
    }

    public function usersGroupe()
    {
        return $this->belongsToMany(User::class);
    }
}

迁移:用户和模型用户:

class User extends Authenticatable
{
    use HasApiTokens;
    use HasFactory;
    use HasProfilePhoto;
    use Notifiable;
    use TwoFactorAuthenticatable;
    use SoftDeletes;

    /**
     * The attributes that are mass assignable.
     *
     * @var string[]
     */
    protected $fillable = [
        'lastname',
        'firstname',
        'email',
        'password',
        'current_team_id',
        'profile_photo_path',
        'role_id',
    ];

    /**
     * The attributes that should be hidden for serialization.
     *
     * @var array
     */
    protected $hidden = [
        'password',
        'remember_token',
        'two_factor_recovery_codes',
        'two_factor_secret',
    ];

    /**
     * The attributes that should be cast.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    /**
     * The accessors to append to the model's array form.
     *
     * @var array
     */
    protected $appends = [
        'profile_photo_url',
        'role_id',
    ];

    protected $dates = [
        'created_at',
        'deleted_at',
        'started_at',
        'update_at'
    ];

    public function forms()
    {
        return $this->hasMany(Forms::class);
    }

    public function formGroupe()
    {
        return $this->belongsToMany(Forms::class);
    }

    public function role()
    {
        //return $this->hasMany(Role::class, 'id', 'role_id');
        return $this->hasOne(Role::class, 'id', 'role_id');
    }

    public function user()
    {
        return $this->hasOne(User::class);
    }
}

迁移:formuser && Models FormsUser:

class FormsUser extends Model
{
    use HasFactory;

    protected $fillable = [
        'forms_id',
        'user_id'
    ];
}

迁移 create_forms_user:

Schema::create('forms_user', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
            $table->unsignedBigInteger('forms_id');
            $table->foreign('forms_id')->references('id')->on('forms');
            $table->unsignedBigInteger('user_id');
            $table->foreign('user_id')->references('id')->on('users');
        });

1
为什么 Laravel 的默认 pivot 关系对你不起作用?https://laraveldaily.com/pivot-tables-and-many-to-many-relationships - Tipu Sultan Eiko
请展示你的模型和迁移文件。 - matiaslauriti
好的,我会编辑问题并添加它们。 - Stack Realtek
2个回答

3

传统上你不必创建一个数据透视模型。 Laravel 有一些命名约定,如果你遵循这些规定,将会使事情变得更加容易。例如,模型应该是单数形式,但表名应该是复数形式,除了数据透视表。例如,你的模型应该如下所示:

class User extends Model { ... }

class Form extends Model { ... }

那么你的表名应该是:

users

forms

form_user

透视表应按字母顺序包括每个表的单数名称。因此,在字母表中F在U之前,因此应该写为form_user。

最后在您的Form模型中,您将包含一个“belongsToMany”函数:

public function users() {
    return $this->belongsToMany('App\User');
}

然后在用户模型中,您需要反向包含相同的内容:

public function forms() {
    return $this->belongsToMany('App\Form');
}

如果您正确地输入了迁移,就永远不需要创建一个枢轴模型。您可以通过关系直接调用其他对象来检索数组。例如:
$user->forms
$form->users

我的模型用户看起来像这样:class User extends Authenticatable{...},因为它是由Jetstream Livewire生成的,这是一个问题吗? - Stack Realtek
这正是我所做的,但是出现了一个错误,告诉我没有名为forms_user的数据透视表,而我的迁移文件却以一个's'字符结尾,名称相同。 - Stack Realtek
您的迁移中的数据透视表应以字母顺序排列的两个类名为基础,其中在它们之间添加下划线。因此...既然您将Forms类命名为复数形式,则您的迁移中的数据透视表应为forms_user。 - Dan Castanera
在查看了您更新的问题后,似乎如果您使用关系“belongsToMany”,则您的表单模型不需要'user_id',这意味着需要一个中间表。我还建议您将'belongsToMany'语句从formGroupe函数中移动并替换User Model中的forms函数。 - Dan Castanera
你找到问题的源头了吗? - Stack Realtek
显示剩余5条评论

0
经过很多艰苦的努力,我终于成功解决了这个问题,所以现在我不再通过模型的交叉表来存储数据,而是直接通过迁移请求来完成。

无论如何,感谢你的参与。 问题已经解决!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接