【问题标题】:Laravel 5 Pivot Table Extra FieldLaravel 5 数据透视表额外字段
【发布时间】:2015-11-16 16:31:50
【问题描述】:

我想要做的是,当创建一个新的候选人时,一个额外的字段会自动填充到连接数据透视表中,并带有随机字符串。

这是我的数据透视表:

结果表(数据透视表)

id  cert_number candidate_id    qualification_id
1   ?           17              2
2   ?           17              1
3   ?           57              1

所以在我的候选控制器中,我有:

public function store(CandidateRequest $request)
{
    $candidateInput = Input::get('candidates');


    foreach ($candidateInput as $candidate)
    {
        $candidate = Candidate::create($candidate);

        $candidate->centre()->attach(Auth::user()->centre);

        $qualification_id = $request->input('qualification_id');

        $candidate->qualification()->attach($qualification_id);

        $cert_number = Str::random(10);

        $candidate->qualification()->attach($cert_number);

    }

    return redirect('candidates');
}

它完美地添加了 center_id 和qualification_id,但它不会将随机字符串拉入 cert_nubmer 字段。

在我的候选模型中,我有

public function result()
{
    return $this->hasMany('App\Result')->withTimestamps();
}

public function qualification()
{
    return $this->belongsToMany('App\Qualification', 'Results', 'candidate_id', 'qualification_id')->withPivot('status','cert_number','partial_claim')->withTimestamps();
}

在我的结果模型中:

public function candidate()
{
   return $this->belongsTo('App\Candidate')->withTimestamps();
}

public function qualification()
{
   return $this->belongsTo('App\Qualification');
}

谁能看出我哪里出错了?

谢谢。

【问题讨论】:

  • 如果你这样做,输出是什么:dd($cert_number)?
  • "nbRLEUFuqA" 所以它生成了一个随机字符串,只是没有传递它
  • 这是错误:SQLSTATE[23000]:完整性约束违规:1452 无法添加或更新子行:外键约束失败(vault3.results,CONSTRAINT result_qualification_id_foreign FOREIGN KEY (qualification_id) REFERENCES qualifications (id)) (SQL: insert into Results (candidate_id, created_at, qualification_id, updated_at) 值 (412, 2015-11-16 16:41:19, A1WzVHh1OX, 2015-11-16 16:41:19))
  • 在我看来,问题出在qualifications 和某处的关系上。但是,这可能是因为您正试图对数据做一些奇怪的事情。如果您删除尝试附加证书会发生什么?
  • 还有(没真正用过attach)但是这不就说明两者之间有关系吗?前两个candidatequalification 正在插入到表中,因为您已经定义了它们的关系,但是我看不到您在哪里定义了certificate?如果此字段不是关系字段,即没有关系,则附加可能是将 cert_id 插入数据库的不好方法

标签: laravel-5 eloquent pivot-table


【解决方案1】:

attach 不能这样工作。

让我取出两行代码:

$candidate->qualification()->attach($qualification_id);
$candidate->qualification()->attach($cert_number);

您正在尝试将 $cert_number 添加为qualification_id,这就是失败的原因。当你这样做时,Laravel 应该如何知道第二行 ($cert_number) 是一个额外的数据透视列?它没有。你有两行完全相同的代码,所以你不能指望 Laravel 知道第二行应该做不同的事情。

当您想将额外的数据插入到其他数据透视列中时,您需要将它们作为数组传递到第二个参数中。像这样的:

$candidate->qualification()->attach($qualification_id, ['cert_number' => $cert_number]);

【讨论】:

    猜你喜欢
    • 2015-05-29
    • 2023-04-06
    • 1970-01-01
    • 2018-01-18
    • 2018-08-18
    • 2014-12-21
    • 2018-12-31
    • 2015-09-10
    • 1970-01-01
    相关资源
    最近更新 更多