【问题标题】:Eloquent hasOne relationship Not working laravel 5.4雄辩的hasOne关系不工作laravel 5.4
【发布时间】:2018-01-11 23:39:24
【问题描述】:

我试图在我的数据库中的两个表之间保持关系。

用户表:

Id User_id Name

联系人表:

Id User_Id contacts

我正在联系人表中保存多个联系人。现在我想检索保存到 User_ID 的所有联系人。为此,我正在尝试建立 hasOne 关系,但我收到以下代码的错误,有人可以让我知道我做错了什么吗?我正在关注官方文档。

用户模型:

class users extends Model
{
   protected $table = "users";
   public function contacts()
    {
        return $this->hasOne('App\contacts','User_Id');
    }
}

联系人型号:

class contacts extends Model
{
    public $table = "contacts";

    public function Users(){
        return $this->belongsTo('App\Users','User_id');
    }
}

控制器:

public function eloquentget(){

        $contacts = Users::find(1)->contacts->first();
        return response()->json($contacts,200);
    }

当我在邮递员中尝试此代码时,我得到一个异常:

ErrorException
Trying to get property of non-object

我做错了什么?任何帮助将不胜感激。

【问题讨论】:

  • 为什么用户表上同时存在idUser_Id?此外,您选择的名称,特别是非标准情况下,您应该考虑遵循 Laravel 建议 w.r.t.命名
  • 代码运行后,您可能希望codereview.stackexchange.com 上的人员运行它,以获取有关@apokryfos 建议的命名约定和表结构的一些反馈。您可能应该改变一些事情以使您将来的生活更轻松。
  • 我正在使用联系人表中的 id 来编辑单独的联系人。因为我有多个使用相同的 user_id。
  • 您从 5.3 更新到 5.4 了吗?我有类似的问题:stackoverflow.com/questions/44994022/…

标签: laravel eloquent


【解决方案1】:

你不需要使用 ->first();因为你已经使用了关系 hasOne

只需使用:

$contacts = Users::find(1)->联系人;

返回响应()->json($contacts,200);

【讨论】:

    【解决方案2】:

    试试这样的

    class users extends Model
    {
       protected $table = "users";
    
       public function contacts()
       {
           return $this->hasMany('App\contacts','User_Id','User_Id');
       }
    }
    

    在你的控制器上,你可以像这样使用它

    $contacts= User::find(1)->contacts; // it will return an array of collection
    

    【讨论】:

      【解决方案3】:

      由于您要为任何给定用户保存多个联系人,因此您使用了错误的关系。您需要使用hasMany() 设置一对多关系。

      class users extends Model
      {
         protected $table = "users";
         public function contacts()
          {
              return $this->hasMany('App\contacts','User_Id','User_Id');
          }
      }
      

      【讨论】:

      • 好的,谢谢。但现在我得到了一个用户数据,但我没有得到联系人数据。它是空的。 contacts: []
      • 试试return $this->hasMany('App\contacts','User_Id', 'User_Id');
      • 是的,做到了。你能告诉我为什么我需要这样做吗?
      • 默认情况下,Laravel 假定 id 列中的值用作相关表中的外键。在您的用户表中,您使用User_Id 而不是Id 列来链接您的表。为了向 Laravel 表明这一点,您需要使用 hasMany() 函数的第三个参数来设置本地密钥。
      • 我如何使用 orderBy 和 where 子句作为联系方式从这里?以及如何在联系人表上对 orderBy 和 Where 子句使用两个不同的调用?请为我澄清这个疑问。
      猜你喜欢
      • 1970-01-01
      • 2017-10-01
      • 1970-01-01
      • 2017-10-12
      • 1970-01-01
      • 1970-01-01
      • 2017-10-04
      • 2022-01-27
      • 2023-04-07
      相关资源
      最近更新 更多