我有一个phone_models,phone_problems和一个phone_model_phone_problem数据透视表。数据透视表有一个额外的列'价格'。
PhoneModel:
class PhoneModel extends \Eloquent
{
public function problems()
{
return $this->belongsToMany('RL\Phones\Entities\PhoneProblem')->withPivot('price');
}
}
PhoneProblem:
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();
所以现在我可以得到这样的价格$row->price
但是我觉得需要更容易和更多的Laravel'这样做的方法。
答案 0 :(得分:100)
当使用与Eloquent的多对多关系时,生成的模型会自动获得分配的pivot
属性。通过该属性,您可以访问数据透视表列。
虽然默认情况下只有pivot对象中的键。要将列添加到那里,您需要在定义关系时指定它们:
return $this->belongsToMany('Role')->withPivot('foo', 'bar');
如果您需要更多帮助来配置与Eloquent的关系,请告诉我。
修改强>
要查询价格,请执行此操作
$model->problems()->where('phone_problem', $problem->id)->first()->pivot->price
答案 1 :(得分:10)
从数据透视表中获取数据:
$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);
第二个参数设置为false意味着您不会分离所有其他相关模型。
或者,旧方式
$model->problems()->updateExistingPivot($problemId, ['price' => $newPrice]);
并提醒你:
删除:
$model->problems()->detach($problemId);
创建 new:
$model->problems()->attach($problemId, ['price' => 22]);
经过测试并证明其在Laravel 5.1 Read more.
中有效答案 2 :(得分:1)
Laravel 5.8〜
如果要创建自定义枢轴模型,可以执行以下操作:
Account.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Account extends Model
{
public function users()
{
return $this->belongsToMany(User::class)
->using(AccountUserPivot::class)
->withPivot(
'status',
'status_updated_at',
'status_updated_by',
'role'
);
}
}
AccountUserPivot.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Relations\Pivot;
class AccountUserPivot extends Pivot
{
protected $appends = [
'status_updated_by_nice',
];
public function getStatusUpdatedByNiceAttribute()
{
$user = User::find($this->status_updated_by);
if (!$user) return 'n/a';
return $user->name;
}
}
在上面的示例中,Account
是您的常规模型,并且您拥有$account->users
,其中的account_user
连接表带有标准列account_id
和user_id
如果创建自定义枢轴模型,则可以将属性和变量添加到关系的列中。在上面的示例中,一旦创建了AccountUserPivot模型,便指示您的Account模型通过->using(AccountUserPivot::class)
使用它。
然后,您可以访问此处其他答案中显示的所有内容,但是也可以通过$account->user[0]->pivot->status_updated_by_nice
访问示例属性(假设status_updated_by
是users表中ID的外键)。
有关更多文档,请参见https://laravel.com/docs/5.8/eloquent-relationships(我建议按CTRL + F并搜索“枢轴”)