Laravel Eloquent别名表

时间:2015-08-07 15:11:13

标签: laravel eloquent

我有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 改变它的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

因此,Eloquent会自动为枢轴构建表名。它采用关系表名称(在本例中为professordiscipline)按字母顺序排列,并使每个单词都是单数。这就是discipline_professor来自的地方。作为另一个示例,usersregions的数据透视表将为region_user。然后,从关系名称和表名中获取表的两个ID,因此它将为professor_iddiscipline_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所期望的一些细节。我所能找到的预期没有明确的清单,因此必须这样做。