Laravel 的“belongsTo”函数不完全确定这是如何工作的帮助从 Blade 模板访问相关模型信息

问题描述

我在理解我正在使用的类中的“belongsTo”方法时遇到问题。 我有一个不是由我编写的“资产”模型,但我猜它可以工作,并且它具有此功能,我正在尝试访问“资产制造”表的“名称属性(其中外部和主要关键参数看起来差不多):

public function assetMake()
{
    return $this->belongsTo(AssetMake::class,'assetmake_id','id');
}

一个看起来像这样的刀片模板中,注入了 $asset 变量(并且已经成功地在同一页面上使用):

                        @foreach($assets as $asset)

                            <tr>
                                <td width="5%" class="filter_id"><a href="/fleet-fuel/assets/{{ $asset['unit_id'] }}__r">{{ $asset['unit_id'] }}</a></td>
                                <td width="20%" class="filter_type">{{ $asset['TypeName'] }}</td>
                                <td width="25%">{{ $asset['description'] }}</td>
                                <td width="20%">{{ $asset->assetMake()->get() }}</td>
                            </tr>

                        @endforeach

“AssetMake”看起来像这样,我需要相应的“hasMany”函数吗?:

 class AssetMake extends Model
{
    use ModelDateSerializeNonISO;
    protected $table = 'assetmake';
    protected $primaryKey = 'id';
    protected $hidden = ['updated','created'];
}

我尝试在刀片模板中访问注入的 $asset 变量,如下所示:

<td width="20%">{{ $asset->assetMake->get }}</td>
<td width="20%">{{ $asset->assetMake->get() }}</td>
<td width="20%">{{ $asset->assetMake()->get }}</td>
<td width="20%">{{ $asset->assetMake->name }}</td>
<td width="20%">{{ $asset->assetMake()->name }}</td>

assetmake 表的 'name' 属性是我真正需要在这里访问的。 这是某种懒惰/急切的加载问题吗?我只是不确定这里到底发生了什么,以及为什么我无法访问该属性。我检查了各种来源,但我尝试过的一切都没有奏效,但我确信它相当简单。有什么提示吗?

解决方法

访问相关模型的方法是像通常调用属性一样调用它。所以像 $asset->assetMake->name 这样的东西应该可以工作。

在幕后,我相信 Laravel 使用 PHP 的魔法方法根据方法名称在模型上创建属性,以便它们指向相关模型(父或子)。

同样,如果您有这样的 hasMany 关系:


public function children()
{
   return $this->hasMany(Child::class,'child_id',);
}

您只需调用 children 即可访问 $parent->children

如果您需要从父级访问子查询构建器,则必须调用 children() 方法。

例如

$parent->children()->create($childData)
,

好的,我解决了。这是控制器的问题。我仍在解决这个问题,Laravel 中的魔法可能让我感到困惑。我在控制器查询中添加了“->join('assetmake','assetmake.id','asset.assetmake_id')”行。并添加到选择语句以及'assetmake.name as AssetMakeName'

$assets = FleetFuel::where('fleet_fuel.customer_id',$user->customer_id)
                        ->where('fleet_fuel.isOrphan',0)
                        ->where('fleet_fuel.hours','>=',0) // -1.00 = first ever record
                        ->where('fleet_fuel.burn',0) // -1.00 = first ever record
                        ->join('asset',function($join) {
                            $join->on('fleet_fuel.unit_id','=','asset.Unit_ID');
                            $join->on('fleet_fuel.customer_id','asset.Customer_ID');
                        })                          
                        ->join('assettype','assettype.ID','asset.assettype_id')
                        ->join('assetmake','asset.assetmake_id')
                        ->select('fleet_fuel.unit_id',DB::raw('max(fleet_fuel.delivery) as lastfuel'),'asset.description','asset.Rego','assettype.Name as TypeName','assetmake.name as AssetMakeName')
                        ->groupBy('fleet_fuel.unit_id')->get();

        return view('fleetFuel.assets',[
                'companyName' => $companyName,'assets' => $assets
            ]
        );

然后在刀片视图中访问它:

<td width="20%" class="filter_make">{{ (isset($asset['AssetMakeName'])) ? ($asset['AssetMakeName']) : ("No make available")}}</td>