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-&gt;assetMake-&gt;name。您收到任何错误消息吗? 这是使用“$asset->assetMake->name”时的错误 - “尝试获取非对象的属性'name'” 另外,$asset 对象的其他实例正在使用 $asset['description'] 语法成功地被读取并显示在该页面上。 我也试过 $asset['assetMake']['name'] 和 $asset['assetMake']->name 并且我检查了数据库中的值不为空。跨度> $asset-&gt;assetMake-&gt;toSql() 输出什么? 【参考方案1】:

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

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

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


public function children()

   return $this->hasMany(Child::class, 'child_id',);


您只需拨打$parent-&gt;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 模板访问相关模型信息的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Tracker 不产生结果

R中多个数据帧的相同功能

Laravel 迁移是如何工作的?

Laravel 获取不属于团队的用户

更新 laravel 关系中的许多记录

如何在Laravel 4中使用Eloquent Model增加列