如何在Laravel 5.8中获得单个记录的相关记录?



我有一个registration表,其中的情况是我有一个months表和一个years表。monthsregistration的关系是one-to-many,yearsregistration的关系也是如此,如下图:

//这里是注册迁移

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的单个实例相关的MonthYear

请提前感谢您的帮助。

这是由于->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();

相关内容

  • 没有找到相关文章

最新更新