Laravel,雄辩的 n:m 关系

Posted

技术标签:

【中文标题】Laravel,雄辩的 n:m 关系【英文标题】:Laravel, Eloquent n:m relationship 【发布时间】:2015-10-07 15:45:36 【问题描述】:

我尝试使用 Eloquent 在 Laravel 中定义一个 n:m 关系。我有以下表格:

用户:

身份证 富

事情

身份证

users_things

thing_id 富

在我的User 模型中,我定义了以下关系

public function things() 
  return $this->hasMany('App\Thing', 'user_things', 'foo', 'thing_id');

Things模型中是对应的

public function users() 
  return $this->hasMany('App\User', 'user_things', 'thing_id', 'foo');

当我调用控制器时

$user = User::find(1) //works
//$thing = Thing::find(1) works
$things = $user->things();
return $things

我收到以下消息:

类 Illuminate\Database\Eloquent\Relations\HasMany 的对象可以 不转换为字符串。

我的问题是,我不能使用 User ID 作为组合表中的外键。它必须是foo 列。

【问题讨论】:

该错误似乎与关系无关。在您的代码中的某处,一个对象被转换为一个字符串。看一下错误信息,应该有错误发生的文件名和行号。请粘贴这部分代码。 当你 return dd($things)? $user->things()` 返回一个 Collection 实例时会发生什么。改用动态属性,看看是否有效:$things = $user->things;$things = $user->things->first(); 【参考方案1】:

您可以试试这个(使用belongsToMany 表示many-to-many 关系):

// User.php

protected $primaryKey = 'foo';
public $incrementing = false;

public function things() 
    return $this->belongsToMany('App\Thing', 'user_things', 'foo', 'thing_id');


// Thing.php
public function users() 
    return $this->belongsToMany('App\User', 'user_things', 'thing_id', 'foo');

最后,使用$user->things 代替$user->things()

【讨论】:

以上是关于Laravel,雄辩的 n:m 关系的主要内容,如果未能解决你的问题,请参考以下文章

雄辩的关系,模型的链接(Laravel 5.4)

Laravel - 雄辩的自我关系

Laravel - 节省雄辩的关系

Laravel 雄辩的一对一通过(级别/树)关系

laravel 雄辩的关系查询

Laravel 复杂的雄辩关系