【问题标题】:Laravel belongsToMany Intermediary TableLaravel 属于ToMany 中间表
【发布时间】:2014-07-06 18:15:41
【问题描述】:

我有 3 个如下所示的表:

市场

  • 身份证
  • 姓名

Market_to_City

  • market_id
  • city_id

城市

  • 身份证
  • 姓名

还有一个看起来像这样的模型:

class Market extends Eloquent {
    protected $table = 'Market';

    public function citys() {
        return $this->belongsToMany('City', 'Market_to_City', 'market_id', 'city_id');
    }
}

每个市场都有许多通过 Market_to_City 表映射的城市。 citys 方法应该返回与市场相关的城市集合。但是,这每次都会返回一个空集合,我是否使用了正确的模型关系?

【问题讨论】:

  • 问题是什么?如何编写选择查询?您不需要为此使用数据透视表。
  • 谢谢,更新帖子以实际提出问题!
  • 您确定您的表中有匹配的数据吗?例如,如果您有一个 id 为 1 的市场,您可以在 Market_to_City 表中看到 markkey_id 为 1 的行,并且这些行中的每一个都有城市值。
  • @user3158900 是的。 Market_to_City 表中有正确包含 market_id 和 city_id(这些各自模型的主键)的条目。
  • 看起来好像您正确设置了关系。您具体是如何实施它们的?

标签: laravel


【解决方案1】:

您的方法看起来是正确的。但是,请注意,您将其命名为 citys 而不是 cities,这可能是也可能不是在此处发布您的问题时的拼写错误。 city 的正确复数形式是 cities,你应该更正它,因为 Laravel 经常使用自动复数并假设你会正确地掌握你的英语。

此外,您的模型称为 Market,而在 cmets 中您称为 GTM_Market

还假设Market 对象没有cities 属性,因此它将成功回退到触发关系查询的方法。如果你碰巧事先声明了属性,Laravel 永远不会到达方法。

class Market extends Eloquent {

    public $cities = 'Foo';

    public function cities()
    {
        return $this->belongsToMany('City');
    }
}

$market = Market::find(205);

echo $market->cities; // Echoes 'Foo' instead of the relationship.

最后,考虑到以上所有问题,您就可以像这样急切加载关系:

Market::with('cities')->find(205);

【讨论】:

  • 方法的名称可以是任何东西。 Laravel 不使用方法名来确定表名。如果未定义表名,Laravel 使用模型/类的名称来确定表名。话虽如此,使用cities() 而不是citys 是正确的。
  • @Jakobud 作为一般规则,我更多地提到了它,但这个错字似乎很重要,因为他在 cmets 中说他实际上是在调用cities,就像这样:$market = GTM_Market::find(205); echo $market->cities
猜你喜欢
  • 2019-07-27
  • 2017-10-27
  • 2015-01-10
  • 2020-08-10
  • 2021-08-25
  • 2018-07-17
  • 2020-04-25
  • 1970-01-01
  • 2021-08-21
相关资源
最近更新 更多