(Laravel 5.3)我有一个代码,在foreach循环中将属性分配给集合(UploadsPois
)。就是这个:
$data= UploadsPois::where('estado_carga', Util::UPLOAD_POIS_CARGA_INGRESADA)
->where('schema_country', $schema_country)
->orderBy('id', 'asc')
->get();
foreach ($data as $carga) {
$carga->UserResponsable = User::findOrFail($carga->responsable);
$carga->Pois = Pois::where('upload_pois_id', $carga->id)->where('pois_validate', Util::POIS_INGRESADO)->orderBy('id', 'asc')->get();
$carga->Log = LogsPois::where('upload_pois_id', $carga->id)
->where('schema_country', $schema_country)
->whereNull('address_id')
->orderBy('id', 'desc')
->first(); // HERE I HAVE A PROBLEM
}
该代码虽然笨拙且运行缓慢,但可以正常运行。我的数据被很好地检索(请查看下图)。我可以使用视图中的数据来读取数据,如下所示:
@foreach($data as $carga)
@if(is_object($carga->Log))
//do something with
$carga->Log->comentario
现在,在@IGP和@Tim Lewis(Laravel, merge two queries in one)的帮助下,我在我的UploadsPois
模型上使用关系替换了该foreach。
UploadsPois
模式具有以下关系:
public function UserResponsable()
{
return $this->belongsTo('App\User', 'responsable');
}
public function Pois()
{
return $this->hasMany('App\Pois', 'upload_pois_id');
}
public function Log()
{
return $this->hasMany('App\LogsPois', 'upload_pois_id');
}
现在控制器上的代码是:
$data = UploadsPois::where([
['estado_carga', Util::UPLOAD_POIS_CARGA_INGRESADA],
['schema_country', $schema_country]
])
->with([
'UserResponsable',
'Pois' => function ($pois) {
$pois->where('pois_validate', Util::POIS_INGRESADO);
},
'Log' => function ($log) use ($schema_country) {
$log->where('schema_country', $schema_country)
->whereNull('address_id')
->orderBy('id', 'desc');
//NOW I'm not calling ti ->first(), so I get the whole collection, but when I use first I get an empty collection
}
])
->orderBy('id', 'asc')
->get();
但是我现在有两个问题:
Log
关系得到3个项目的集合。我认为问题在于->first()
部分中省略的->with([])
。$data->Log
了,因为现在Log
,Pois
和UserResponsable
都不是属性,而是它们的关系。这是dd($data->first());
的屏幕截图,其中包含旧代码和具有相关性的新代码:
答案 0 :(得分:0)
您的第二种方法比第一种好。您可以做类似的事情,
1)建立另一个hasOne()
public function singleLog() {
return $this->hasOne('App\LogsPois', 'upload_pois_id')->latest();
}
2)在检索数据时(处理时)仅获得第一个结果// take value using hard coded like Log[0]
3)在模型中建立范围
public function scopeGetSignleLog($query, $schema_country)
{
return $query->where('schema_country', $schema_country)
->whereNull('address_id')
->orderBy('id', 'desc')
->first();
}
在控制器中,
$data = UploadsPois::where([
['estado_carga', Util::UPLOAD_POIS_CARGA_INGRESADA],
['schema_country', $schema_country]
])
->with([
'UserResponsable',
'Pois' => function ($pois) {
$pois->where('pois_validate', Util::POIS_INGRESADO);
},
'Log' => function ($log) use ($schema_country) {
return $log->getSignleLog($schema_country;)
}
])
->orderBy('id', 'asc')
->get();
希望这会有所帮助:)