我对Laravel非常陌生,目前正在尝试。 因此,我决定尝试建立一个假设的在线销售产品的关系,该产品在数据库中具有“ country_from”和“ country_to”字段。长话短说,我建立了联系,每当我通过表格制作产品时,数据就会正确反映在数据库中。但是,当我尝试显示数据(国家名称)时,出现错误“试图获取非对象的属性'名称'”。
Product
模型
protected $fillable = [
'country_from',
'country_to',
'title',
'body',
'price',
'availability'
];
public function countries(){
return $this->belongsTo('App\Country');
}
Country
模型
protected $fillable = ['name'];
public static $rules = array('name'=>'required|min:3');
public function products(){
return $this->hasMany('App\Product');
products
表:id,user_id,category_id,country_id,country_forum,country_to,photo_id,标题,正文,价格,可用性,created_at,updated_at
countries
表:ID,名称,created_at,updated_at
在我的刀片服务器$product->country_from
中显示设置ID的正确值。
但是,当我尝试进行以下操作时:$product->country->name
我得到了:
ErrorException(E_ERROR)试图获取非对象的属性'name'
有人知道我在做什么错吗?我对Laravel和PHP完全陌生,我的赌注是我在关系方面做错了,但是我不知道该怎么办。
答案 0 :(得分:1)
您正在尝试从名为“ country
”的对象获取名称。但是,您已将关系定义为countries
。
建议您将产品模型上的关系名称更改为单数,因为它是属于关系:
public function country(){
return $this->belongsTo('App\Country');
}
然后,当您致电时:
{{$product->country->name}}
如果ID附加了一个国家/地区,则由于没有对象,您也不会例外。
但是,还有另一个问题,在当前状态下仍然会失败。您已将外键定义为country_to
和country_from
。在默认情况下,country()
关系中的Laravel将寻找一个名为country_id
的字段进行匹配。您需要针对每种想要的关系类型(countryTo()
和countryFrom()
)直接将外键添加到关系中,以使其起作用。
答案 1 :(得分:0)
您需要调用Product
模型中定义的关系函数。以下应该起作用:
{{$product->countries->name}}
您要在从未定义的产品模型上调用->country
,因此会出现错误。
注意 我建议您将关系函数从复数更改为单数,例如:
countries()
到country()
,因为产品只能属于一个国家/地区。
希望对您有帮助!