如何解决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>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。