Laravel,关系变得空虚

时间:2019-10-09 12:53:24

标签: laravel laravel-5 eloquent

(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了,因为现在LogPoisUserResponsable都不是属性,而是它们的关系。
  • li>

这是dd($data->first());的屏幕截图,其中包含旧代码和具有相关性的新代码:

enter image description here

1 个答案:

答案 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();

希望这会有所帮助:)