Laravel 中的多对多关系

Many to many relationship in Laravel

我正在尝试在 Laravel 5.3 上构建一个应用程序,其中我的模型、数据库和控制器位于不同的文件夹中。我有以下文件夹结构:

Nitseditor
    System
        Controllers
        Database
            2016_12_28_130149_create_domains_table.php
            2017_01_06_193355_create_themes_table.php
            2017_01_07_140804_create_themes_domains_table.php
        Models
            Domain.php
            Theme.php

我在域中建立多对多关系,即

public function themes()
{
    return $this->belongsToMany('Nitseditor\System\Models\Domain');
}

我在 2017_01_07_140804_create_themes_domains_table.php

中命名了 table domain_theme

现在我正在尝试获取属于控制器中域的主题名称,如下所示:

$flashmesage = new Domain;

foreach ($flashmesage->themes as $theme)
{
    return $theme->theme_name;
}

我遇到一个错误:

SQLSTATE[42S02]: Base table or view not found: 1146 Table 'nitswebbuilder.domain_domain' doesn't exist (SQL: select domains.*, domain_domain.domain_id as pivot_domain_id from domains inner join domain_domain on domains.id = domain_domain.domain_id where domain_domain.domain_id is null and domains.deleted_at is null)

Table 名字应该叫domain_theme。如果您已经为外键使用了正确的名称并建立了正确的关系,whereHas() 将适合您:

$domainName = 'example.com';

$themes = Theme::whereHas('domains', function($q) ($domainName) {
    $q->where('domain_name', $domainName);
})->get();

然后显示所有主题名称:

@foreach ($themes as $theme)
    {{ $theme->theme_name }}
@endforeach

抱歉我的简短评论作为回答...我没有足够的评论声誉,

将您的 themes() 方法更改为:

public function themes()
{
    return $this->belongsToMany('Nitseditor\System\Models\Theme');
}

有关详细信息,请参阅 Here