Laravel“属于”功能。不完全确定这是如何工作的。帮助从 Blade 模板访问相关模型信息
Posted
技术标签:
【中文标题】Laravel“属于”功能。不完全确定这是如何工作的。帮助从 Blade 模板访问相关模型信息【英文标题】:Laravel "belongsTo" function. Not exactly sure how this works. Help to access related model info from Blade template 【发布时间】:2021-08-14 12:22:41 【问题描述】:我在理解我正在使用的课程中的“belongsTo”方法时遇到问题。 我有一个不是我写的“资产”模型,但我猜它可以工作,它有这个功能,我试图访问“资产制作”表的“名称”属性(哪个外国和主要关键参数看起来是正确的):
public function assetMake()
return $this->belongsTo(AssetMake::class, 'assetmake_id', 'id');
在一个看起来像这样的刀片模板中,其中注入了 $asset 变量(并且已成功在同一页面上使用):
@foreach($assets as $asset)
<tr>
<td class="filter_id"><a href="/fleet-fuel/assets/ $asset['unit_id'] __r"> $asset['unit_id'] </a></td>
<td class="filter_type"> $asset['TypeName'] </td>
<td > $asset['description'] </td>
<td > $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 > $asset->assetMake->get </td>
<td > $asset->assetMake->get() </td>
<td > $asset->assetMake()->get </td>
<td > $asset->assetMake->name </td>
<td > $asset->assetMake()->name </td>
assetmake 表的 'name' 属性是我真正需要在这里访问的。 这是某种懒惰/急切的加载问题吗?我只是不确定这里到底发生了什么,以及为什么我无法访问该物业。我已经检查了各种来源,但我没有尝试过任何工作,但我确信它相当简单。有什么建议吗?
【问题讨论】:
首先,这是正确的:$asset->assetMake->name
。您收到任何错误消息吗?
这是使用“$asset->assetMake->name”时的错误 - “尝试获取非对象的属性'name'”
另外,$asset 对象的其他实例正在使用 $asset['description'] 语法成功地被读取并显示在该页面上。
我也试过 $asset['assetMake']['name'] 和 $asset['assetMake']->name 并且我检查了数据库中的值不为空。跨度>
$asset->assetMake->toSql()
输出什么?
【参考方案1】:
访问相关模型的方法是像通常调用属性一样调用它。所以像$asset->assetMake->name
这样的东西应该可以工作。
在幕后,我相信 Laravel 使用 php 的魔法方法根据方法名称在模型上创建属性,以便它们指向相关模型(父或子)。
同样,如果您有这样的hasMany
关系:
public function children()
return $this->hasMany(Child::class, 'child_id',);
您只需拨打$parent->children
即可访问children
。
如果您需要从父级访问子查询生成器,则必须调用children()
方法。
例如
$parent->children()->create($childData)
【讨论】:
【参考方案2】:好的,我解决了。这是控制器的问题。我仍在解决这个问题,Laravel 的魔力可能会让我感到困惑。我在控制器查询中添加了“->join('assetmake', 'assetmake.id', 'asset.assetmake_id')”行。并添加到 select 语句以及 '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', 'assetmake.id', '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 class="filter_make"> (isset($asset['AssetMakeName'])) ? ($asset['AssetMakeName']) : ("No make available")</td>
【讨论】:
这是使用查询构建器的一种方法,但这不是一个雄辩的关系。所以它可能会起作用,但这不是最好的方法。以上是关于Laravel“属于”功能。不完全确定这是如何工作的。帮助从 Blade 模板访问相关模型信息的主要内容,如果未能解决你的问题,请参考以下文章