【发布时间】:2019-04-14 00:34:10
【问题描述】:
我正在尝试编写一个具有多个“位置”的应用程序,用户可以将这些位置添加为他们的收藏夹。我有一个 Locations 模型、一个收藏夹模型和一个数据库表,我在其中记录 user_id 和 location_id 对以指示用户最喜欢的位置。
在我的 Location 模型中,我定义了以下 hasMany 关系:
public function favorites(){
return $this->hasMany(Favorite::class);
}
我还定义了Favorite模型上的反比关系如下:
public function location(){
return $this->belongsTo(Location::class);
}
然后在一个视图中,我试图获取所有位置的列表,并标记用户标记为收藏的位置。为此,我遍历所有位置,并尝试计算该位置有多少收藏夹。它应该是 1 或 0,因为 user_id/location_id 组合行仅在用户将特定位置作为他的最爱时才存在。
这是代码的相关部分(我将位置列表传递给视图):
@foreach ($Locations_List as $Location)
{{ $Location->favorites()->get()->count }}
@endforeach
这是我传递 $Locations_List 的方式:
public function Create_SearchResults(){
$Locations_List = Location::select('id', 'Name', 'Category', 'Logo', 'Status', 'Address_Number', 'Address_Street', 'Address_City', 'Updated_At')
->where('Status', '>=', 500)
->get();
return view('Location_Search/Index', compact('Locations_List'));
}
但是,当我尝试上述操作时,我得到“此集合实例上不存在属性 [count]。”。
我尝试在 tinker 中做与上述类似的事情,它确实有效。但是,我必须按如下方式解析其中的“数组”部分:
$loc = App\Location::find(2);
$loc->favorites()->get()->count();
如何解决视图上的“数组”问题?提前致谢
【问题讨论】:
-
如何获得
$Locations_List变量,请显示您的控制器代码。而且,你不应该在循环中调用 get(),而是使用 EagerLoading -
您的问题中缺少代码中最重要的部分,因此任何人都很难在这里为您提供帮助。错误告诉您
$Locations_List是一个数组,它不能在数组上调用函数favourites(),这是正确的。这应该立即触发你的想法,等等,为什么它是一个数组?它应该是模型的集合。因此,正如@Zuko 所说,请分享您定义$Locations_List的位置,我们很可能会立即看到导致问题的原因。 -
谢谢!我实际上并没有想到我传递 $Locations_List 的方式是潜在的问题。我确实是作为数组传递的,并且我已经如上所示进行了编辑。请参阅上面的控制器代码的编辑文本和我得到的更新错误。