Laravel hasMany和belongsTo参数

时间:2017-10-20 01:31:20

标签: php mysql laravel eloquent

我有一个表存储,而商店有很多库,在库中我有商店store_id的外键。

存储表

id(PK)

图书馆表

id(PK)
store_id(FK)

我对hasManybelongsTo参数包含的内容感到困惑,docs表示

  

返回$ this-> hasMany('App \ Comment','foreign_key');

     

返回$ this-> hasMany('App \ Comment','foreign_key','local_key');

     

返回$ this-> belongsTo('App \ Post','foreign_key','other_key');

hasMany foreign_key和local_key来自哪个表?与belongsTo相同,foreign_key和other_key的表来自哪个?

商店模式

public function library(){
    return $this->hasMany('App\Library', 'what_foreign_key_should_be_here','what_other_key_should_be_here');
}

图书馆模型

public function stores(){
    return $this->belongsTo('App\Stores', 'what_foreign_key_should_be_here', 'what_other_key_should_be_here');
}

因为有时我将表的主键id更改为sid之类的其他名称,所以我总是想指定哪个是外键和主键

3 个答案:

答案 0 :(得分:10)

要简化语法,请将return $this->hasMany('App\Comment', 'foreign_key', 'local_key');参数视为:

  1. 您要链接到的模型
  2. 链接回当前表的id列的外表(要链接的表)的列(除非您指定第三个参数,在这种情况下它将使用该列)< / LI>
  3. 应当使用的当前表的列 - 即如果您不希望其他表的外键链接到当前表的id
  4. 在您的情况下,因为您在store_id表格中使用了libraries,所以您已经让自己的生活变得轻松。在Store模型中定义时,以下内容应该完美无缺:

    public function libraries()
    {
        return $this->hasMany('App\Library');
    }
    

    在幕后,Laravel会自动将id表的Store列链接到store_id表的Library列。

    如果你想明确定义它,那么你会这样做:

    public function libraries(){
        return $this->hasMany('App\Library', 'store_id','id');
    }
    
    • 模型标准是单个命名函数返回belongsTo,而复数函数返回hasMany(即。$store->libraries() or $library->store())。

答案 1 :(得分:3)

试试这个。有用。将其添加到您的模型中。

图书馆模型

public function store()
    {
        return $this->belongsTo(Store::class, 'store_id', 'id');
    }

商店模式

 public function library()
    {
        return $this->hasMany(Library::class);
    }

示例代码。

 $store = Store::find(1);
 dd($store->library);

答案 2 :(得分:0)

存储表:

store_id (PK)

图书馆表:

library_id (PK) 
library_fk_store_id (FK)

店铺模式:

public function libraries()
{
    return $this->hasMany(Library::class, 'library_fk_store_id','library_id');
}

库模型:

public function store()
{
        return $this->belongsTo(Store::class, 'library_fk_store_id', 'store_id');
}
  • 外键在两种方法中相同
`library_fk_store_id`
  • 本地/所有者键是来自相反模型/表的 ID:
`Store model -> library_id`
`Library model -> store_id`
  • 本地/所有者键与方法名称具有相同名称:
`libraries() -> library_id`
`store() -> store_id`