Laravel中出现麻烦,显示关系对象的名称

时间:2019-07-10 22:40:02

标签: php laravel eloquent

我对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完全陌生,我的赌注是我在关系方面做错了,但是我不知道该怎么办。

2 个答案:

答案 0 :(得分:1)

您正在尝试从名为“ country”的对象获取名称。但是,您已将关系定义为countries

建议您将产品模型上的关系名称更改为单数,因为它是属于关系:

public function country(){
   return $this->belongsTo('App\Country');
}

然后,当您致电时:

{{$product->country->name}}

如果ID附加了一个国家/地区,则由于没有对象,您也不会例外。

但是,还有另一个问题,在当前状态下仍然会失败。您已将外键定义为country_tocountry_from。在默认情况下,country()关系中的Laravel将寻找一个名为country_id的字段进行匹配。您需要针对每种想要的关系类型(countryTo()countryFrom())直接将外键添加到关系中,以使其起作用。

答案 1 :(得分:0)

您需要调用Product模型中定义的关系函数。以下应该起作用:

{{$product->countries->name}}

您要在从未定义的产品模型上调用->country,因此会出现错误。


注意 我建议您将关系函数从复数更改为单数,例如:

countries()country(),因为产品只能属于一个国家/地区。


希望对您有帮助!