【问题标题】:Laravel hasMany and belongsTo parametersLaravel hasMany 和 belongsTo 参数
【发布时间】:2018-04-01 03:45:19
【问题描述】:

我有一个表存储,并且存储有很多库,在库中我有存储 store_id 的外键。

存储表

id(PK)

库表

id(PK)
store_id(FK)

我对 hasManybelongsTo 参数感到困惑,在 docs 它说

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

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

return $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,所以我总是想指定哪个是外键和主键

【问题讨论】:

    标签: php mysql laravel eloquent


    【解决方案1】:

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

    1. 您要链接到的模型
    2. 外部表的列(您要链接的表)链接回当前表的id 列(除非您指定第三个参数,在这种情况下它将使用该参数)
    3. 应该使用的当前表的列 - 即如果您不希望另一个表的外键链接到当前表的 id

    在您的情况下,因为您在libraries 表中使用了store_id,所以您的生活变得轻松了。在您的 Store 模型中定义时,以下内容应该可以正常工作:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      库模型

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

      店铺模式

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

      示例代码。

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

      因为在这种情况下,一个商店有很多库,Store 模型有一个libraries() 函数。有关此标准的更多信息,请参阅James' answer 的最后一行。

      【讨论】:

        【解决方案3】:

        存储表:

        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`
        • Lo​​cal/Owner 键是来自相反模型/表的 ID:
        `存储模型-> library_id` `库模型-> store_id`
        • 本地/所有者键的名称与方法名称相同
        `libraries() -> library_id` `store() -> store_id`

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-07-26
          • 1970-01-01
          • 1970-01-01
          • 2015-12-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多