我有一个registration
表,其中的情况是我有一个months
表和一个years
表。months
与registration
的关系是one-to-many
,years
与registration
的关系也是如此,如下图:
//这里是注册迁移
public function up()
{
Schema::create('registrations', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->string('father_name');
$table->string('contact1');
$table->string('contact2')->nullable();
$table->string('address')->nullable();
$table->integer('amount');
$table->integer('day');
$table->unsignedInteger('month_id');
$table->unsignedBigInteger('year_id');
$table->timestamps();
});
}
下面是Registration
模型:
class Registration extends Model
{
protected $fillable =
['name', 'father_name', 'contact1', 'contact2', 'address', 'amount',
'day', 'month_id', 'year_id'
];
public function month()
{
return $this->belongsTo(Month::class);
}
public function year()
{
return $this->belongsTo(Year::class);
}
}
这是Month
模型:
class Month extends Model
{
public function registration()
{
return $this->hasMany(Registration::class);
}
}
这是Year
模型:
class Year extends Model
{
public function registration()
{
return $this->hasMany(Registration::class);
}
}
现在,当我想显示一个registration
记录及其关系如下时,我得到所有注册记录而不是一个。
public function show(Registration $reg)
{
$registration = $reg::with('month', 'year')->get();
return ['registration' => $registration];
}
当我使用with
函数与模态名称,然后我得到所有记录正确,但当我使用它,即使与模态的单个实例,我仍然得到所有相关的记录,我不想要的。我想选择与registration
的单个实例相关的Month
和Year
。
请提前感谢您的帮助。
这是由于->get();
在$reg
中你有一个实例,但是当你用->get();
发出一个新的请求时,get
显示了所有的记录
像这样做
public function show($regId)
{
$registration = Registration::with('month', 'year')->findOrFail($regId);
return ['registration' => $registration];
}
你可以这样做:
public function show(Registration $reg)
{
$reg->load(['month', 'year']);
return ['registration' => $reg];
}
您还可以删除模型绑定,并使用with()
进行动态加载。
public function show($id)
{
$registration = Registration::with(['year', 'month'])
->firstWhere('id', $id);
return ['registration' => $registration];
}
它认为您没有指定关系中的foreign_key。或者你需要定义foreign_key
class Registration extends Model
{
protected $fillable = [
'name', 'father_name', 'contact1', 'contact2', 'address',
'amount','day', 'month_id', 'year_id'
];
public function month()
{
return $this->belongsTo(Month::class,'month_id');
}
public function year()
{
return $this->belongsTo(Year::class,'year_id');
}
}
也许它会解决你的问题。
实际上get()方法将返回一个记录数组,您可以遍历这些记录,这就是为什么您可以获得所有记录的原因。您是否尝试过使用first()方法,它将只返回一条记录。
$registration = $reg::with('month', 'year')->first();