通过 Laravel 中的中间表进行选择

问题描述 投票:0回答:1

我有三张桌子:

  1. 站点表(主表)
  2. 列表表(它有
    sites_id
    作为外键)
  3. 新闻表(它有
    listing_id
    作为外键)

如何在站点模型中定义关系以获取与特定站点相关的所有“新闻”。我已尝试以下操作,但它不起作用并返回 0 计数。

$news = $site->news()->count();

public function news()
    {
        return $this->hasManyThrough(
            News::class,
            Listing::class,
            'id',
            'id',
            'listing_id',
            null,
        );
    }
laravel eloquent-relationship
1个回答
0
投票

要在 Site 模型中定义一个关系以通过列表获取所有相关新闻,您需要正确设置 hasManyThrough 关系。 hasManyThrough 关系用于定义“has-many-through”关系,其中一个模型通过中间模型与另一个模型相关。

以下是站点模型中 hasManyThrough 关系的正确设置:

站点模型:定义 hasManyThrough 关系以通过列表获取新闻。

public function news()
{
    return $this->hasManyThrough(
        News::class,       // The final model we want to access
        Listing::class,    // The intermediate model
        'site_id',         // Foreign key on the Listing model
        'listing_id',      // Foreign key on the News model
        'id',              // Local key on the Site model
        'id'               // Local key on the Listing model
    );
}

列表模型:确保将 site_id 列设置为外键。

public function site()
{
    return $this->belongsTo(Site::class);
}

新闻模型:确保listing_id列设置为外键。

public function listing()
{
    return $this->belongsTo(Listing::class);
}

获取新闻计数,现在您可以获取与特定站点相关的新闻计数,如下所示:

$site = Site::find($siteId);
$newsCount = $site->news()->count();

以下是 hasManyThrough 方法中使用的参数的详细细分:

  • News::class:我们要访问的最终模型(新闻)。
  • Listing::class:中间模型(Listing)。
  • 'site_id':Listing 模型上的外键,将其链接到 场地模型。
  • 'listing_id':新闻模型上的外键,将其链接到 上市模型。
  • 'id':Site 模型上的本地键(Site 的主键) 型号)。
  • 'id':Listing 模型上的本地键(Listing 的主键) 型号)。

确保 hasManyThrough 方法中的外键和主键与您的实际数据库架构匹配。

通过此设置,$site->news()->count() 应正确返回与特定站点相关的新闻项的计数。

© www.soinside.com 2019 - 2024. All rights reserved.