【问题标题】:Understanding Laravel Eloquent and traditional table mapping了解 Laravel Eloquent 和传统的表映射
【发布时间】:2016-10-17 18:50:45
【问题描述】:

我正在尝试了解 laravel 雄辩的映射功能。 如果我有 3 张桌子:

Article
Asset
ArticleAssetMap

文章:一个简单的表格、ID、标题、正文、日期等。

资产:资产路径、日期等

ArticleAssetMap:两列。 article_id,asset_id

我需要了解如何向我的模型描述,当我请求所有或部分文章时,检查地图表,如果找到地图,也获取资产...

我有上面所有表格的模型,并且真的认为这与雄辩的 onetomany/belongsto 等有关...但是找不到像样的教程来为我分解它...我是愚蠢..有什么好办法'得到它..?

【问题讨论】:

  • 默认情况下,laravel eloquent 会寻找“正确的列”名称。例如资产表将有一个asset_id 作为它的主键。在文档中,可以通过在模型上添加额外的参数来指定 PK 和 FK。
  • 啊,我的资产表只有 'id' 作为主键...应该重命名为asset_id 和文章等相同吗?
  • 是的,或者尝试指定字段名称。还可以使用 laravel 的 artisan 创建模型和迁移。这是文档laravel.com/docs/5.3/eloquent-relationships#one-to-many

标签: php laravel eloquent


【解决方案1】:

将您的第三个表命名为article_asset,然后执行以下操作。

在你的 Article 班级中

// if one article has many assets
public function assets()
{
    return $this->hasMany(Asset::class);
}

// if one article has only one assets
public function asset()
{
    return $this->hasOne(Asset::class);
}

在您的 Asset 班级中

如果资产属于一篇文章

public function article()
{
    return $this->belongsTo(Article::class);
}

如果一个资产属于许多文章

public function articles()
{
    return $this->belongsToMany(Article::class);
}

你现在可以走了。

【讨论】:

  • 其实这可能是多对多的情况。即一个资产可能属于许多文章,而一篇文章可能包含许多资产。
  • 添加了一篇文章可能包含许多资产的场景。添加其他人。
  • 嗯.. no.. 基于表模式,显然ArticleAssetMap 是一个数据透视表。就像我们在这里只需要->belongsToMany()
  • 这太棒了.. 所以我重命名的表 artice_asset 不再需要模型了?
  • 是的,如果你按照 Laravel 的约定来做,只需在你的 Asset 类上添加 ->belongsToMany(Article::class) ,它就会使用你的 article_asset 表作为枢轴,反之亦然;跳过对数据透视表模型的需求。
【解决方案2】:

您还可以通过将附加参数传递给 hasMany 方法来覆盖外键和本地键:

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

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

https://laravel.com/docs/5.3/eloquent-relationships#one-to-many

【讨论】:

    猜你喜欢
    • 2017-07-13
    • 2011-09-21
    • 2016-07-21
    • 2016-09-10
    • 2018-01-31
    • 2015-10-16
    • 1970-01-01
    • 2020-12-19
    • 2014-09-23
    相关资源
    最近更新 更多