dongwen7371 2015-01-16 15:30
浏览 35
已采纳

在Laravel 4中使用数据透视表时如何分配关系?

Details

I have 3 tables :

  • catalog_downloads
  • export_frequencies
  • export_frequencies_catalog_downloads (Pivot Table)

Diagram

enter image description here

I am not sure if I set the relation between them correctly. Please correct me if I am wrong.

Here is what I did

In CatalogDownload.php

public function export_frequencies(){ 
        return $this->belongsToMany('ExportFrequency','export_frequencies_catalog_downloads','export_frequency_id','catalog_download_id');
    }

In ExportFrequency.php

public function catalog_downloads(){ 
        return $this->belongsToMany('CatalogDownload','export_frequencies_catalog_downloads','export_frequency_id','catalog_download_id');
    }

Questions

  • According to my diagram - Did I assign the relationship correctly ? I hope I didn't mix up between hasMany and belongsTo

  • Will I need a class or a model for a Pivot Table ?

Thanks

  • 写回答

2条回答 默认 最新

  • dongyang2229 2015-01-16 16:02
    关注

    Since export_frequencies is in the CatalogDownload model you have to invert the ID's because the parameters of belongsToMany are as follows:

    1. Name of the referenced (target) Model (ExportFrequency)
    2. Name of the Pivot table
    3. Name of the id colum of the referencing (local) Model (CatalogDownload in this case)
    4. Name of the id colum of the referenced (target) Model (ExportFrequency in this case)
    

    what leads to this function:

    public function export_frequencies(){ 
    
            return $this->belongsToMany('ExportFrequency','export_frequencies_catalog_downloads','export_frequency_id','catalog_download_id');
        }
    

    The other function was correct.

    If you had some data in your pivot table, for instance a colum with the name someCounter then you will have to tell the relation to load that column when creating the pivot object like this:

    public function export_frequencies(){ 
    
            return $this->belongsToMany('ExportFrequency','export_frequencies_catalog_downloads','export_frequency_id','catalog_download_id')->withPivot('someCounter');
    }
    

    That will load the column and make it avalible like this:

    $catalogDownload->export_frequencies()->first()->pivot->someCounter;
    

    You will need a separate Pivot Model if you need to do some special handling for the fields or if that pivot itself has a relation of its own but then you might consider using a full blown model instead of a pure Pivot Model.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • douye2572 2015-01-16 16:28
    关注

    As an added note to the accepted answer, you are able to set up your many to many relationships without referencing the pivot table and the relevant id's as long as you follow a specific convention.

    You can name your pivot table using singular references to the related tables, like 'catalog_download_export_frequency'. Notice the alphabetic order of the singular references.

    Then you can simply do:

    // CatalogDownload Model
    public function exportFrequencies()
    {
        return $this->belongsToMany('ExportFrequency');
    }
    
    // ExportFrequency Model
    public function catalogDownloads()
    {
        return $this->belongsToMany('CatalogDownload');
    }
    

    This will then allow you to run queries using the query builder or Eloquent like:

    $catalogDownload->exportFrequencies()->get(); // Get all export frequencies for a specific CatalogDownload.
    

    Or

    $this->catalogDownload->with('exportFrequencies')->find($id); // Using eager loading and dependency injection, when CatalogDownload is assigned to $this->catalogDownload
    

    Hope this helps!

    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 matlab+波形匹配算法
  • ¥15 转录组分析做聚类树图时癌旁组被分到了癌组
  • ¥15 大一Python字典
  • ¥15 multisim电路设计(相关搜索:设计报告)
  • ¥15 PC-lint Plus
  • ¥15 gpl24676注释
  • ¥15 php5.3内存泄露
  • ¥15 DigSilent如何复制复合模型到自己案例?
  • ¥15 求日版华为b610s-77a 官方公版固件,有偿
  • ¥15 关于#java#的问题,请各位专家解答!(相关搜索:java程序)