获取额外数据透视表列 laravel 的值

2022-08-30 08:22:33

我有一个phone_models,phone_problems和一个phone_model_phone_problem数据透视表。数据透视表有一个额外的列“价格”。

手机型号:

class PhoneModel extends \Eloquent
{
    public function problems()
    {
        return $this->belongsToMany('RL\Phones\Entities\PhoneProblem')->withPivot('price');
    }
}

电话问题:

class PhoneProblem extends \Eloquent
{
    public function models()
    {
        return $this->belongsToMany('PhoneModel')->withPivot('price');
    }
}

我试图做的是获得具有特定问题的特定手机的价格。

这就是我现在拥有它的方式,但我觉得Laravel有一个内置的Eloquent功能,我找不到以更简单的方式做到这一点:

$model = $this->phoneService->getModelFromSlug($model_slug);
$problem = $this->phoneService->getProblemFromSlug($problem_slug);

所有这一切都是从他们的slug中选择特定的模型和问题。

然后我所做的就是使用这些凭据,我得到的价格是这样的:

$row = DB::table('phone_model_phone_problem')
->where('phone_model_id', '=', $model->id)
->where('phone_problem', '=', $problem->id)
->first();

所以现在我可以得到这样的价格,但我觉得需要一种更简单,更“Laravel”的方式来做到这一点。$row->price


答案 1

将“多对多”关系与 Eloquent 结合使用时,生成的模型会自动获得分配的属性。通过该属性,您可以访问数据透视表列。尽管默认情况下,透视对象中只有键。要将列也放在那里,您需要在定义关系时指定它们:pivot

return $this->belongsToMany('Role')->withPivot('foo', 'bar');

官方文档

如果您在配置与Eloquent的关系时需要更多帮助,请告诉我。

编辑

要查询价格,请执行此操作

$model->problems()->where('phone_problem', $problem->id)->first()->pivot->price

答案 2

要从数据透视表获取数据:

$price = $model->problems()->findOrFail($problem->id, ['phone_problem'])->pivot->price;

或者,如果您有许多不同价格的记录:

$price = $model->problems()->where('phone_problem', $problem->id)->firstOrFail()->pivot->price;

另外。

更新透视中的数据,您可以采用新的方式

$model->problems()->sync([$problemId => [ 'price' => $newPrice] ], false); 

如果第 2 个参数设置为 false,则表示您不会分离所有其他相关模型。

或者,走老路

$model->problems()->updateExistingPivot($problemId, ['price' => $newPrice]);

并提醒您:

删除

$model->problems()->detach($problemId);

新建

$model->problems()->attach($problemId, ['price' => 22]);

它已经过测试并被证明可以在Laravel 5.1中工作 阅读更多。


推荐