我有3张桌子:
professor | id | name
discipline | id | name
和一个链接他们
disc_prof | prof_id | disc_id
如何以Inner Join
的形式检索数据?
是这样的:
SELECT prof.name, prof.id, disc.id, disc.name
FROM disc_prof AS dc INNER JOIN professor as prof ON prof.id = dc.prof_id
INNER JOIN discipline AS disc ON dc.disc_id = disc.id
到目前为止我做了什么:
class Professor extends Model
{
protected $table = "professor";
public function disc()
{
return $this->belongsToMany('App\Discipline');
}
}
class Disciplina extends Model
{
protected $table = "discipline";
}
但我收到以下错误:
Base table or view not found: 1146 Table 'database.discipline_professor' doesn't exist
它不是database.discipline_professor
,而是database.disc_prof
改变它的正确方法是什么?
答案 0 :(得分:1)
因此,Eloquent会自动为枢轴构建表名。它采用关系表名称(在本例中为professor
和discipline
)按字母顺序排列,并使每个单词都是单数。这就是discipline_professor
来自的地方。作为另一个示例,users
和regions
的数据透视表将为region_user
。然后,从关系名称和表名中获取表的两个ID,因此它将为professor_id
和discipline_id
。
您可以在创建关系时解决这个问题。如果您查看Model::belongsToMany()
的{{3}},您会看到参数为:
string $related, string $table = null, string $foreignKey = null, string $otherKey = null, string $relation = null
因此,您需要设置$table
,$foreignKey
和$otherKey
。在你的情况下:
class Professor extends Model
{
protected $table = "professor";
public function disc()
{
return $this->belongsToMany('App\Discipline', 'disc_prof', 'prof_id', 'disc_id');
}
}
作为旁注,我高度建议在Eloquent中使用推荐的名称。所有表格都应该是复数,所有的表格都应该与我上面说的相匹配,所有的外键都应该是单数形式的关系名称+ _id
等。这将使Eloquent的工作变得更加容易和快捷。您可以在docs文档中找到Eloquent所期望的一些细节。我所能找到的预期没有明确的清单,因此必须这样做。