未找到 Laravel 数据透视表

Posted

技术标签:

【中文标题】未找到 Laravel 数据透视表【英文标题】:Laravel Pivot table not found 【发布时间】:2016-08-19 13:24:41 【问题描述】:

我的目标。 我有 3 个 Laravel 模型:usercampaigncampaign_players。我想获取有关用户的信息,以及他/她正在玩的广告系列。

问题。 当我运行此查询时:

$campaigns = user::with(['campaigns_playing'])->where('id', $id)->get();

它给了我这个信息:

"未找到基表或视图:1146 表 'sagohamnen.campaign_players' 不存在(SQL:选择 sh_campaigns.*, campaign_players.user_idpivot_user_id, campaign_players.id as pivot_id from sh_campaigns 内部连接 campaign_players on sh_campaigns.id = campaign_players.id 其中campaign_players.user_id in (2))"

由于某种原因,它似乎找不到表名。你们知道导致问题的原因以及如何解决它吗?

这是来自我的模型和它的数据库表的简短代码。

用户

protected $table = 'sh_users';
public function campaigns_playing()

        return $this->belongsToMany('Sagohamnen\campaign\campaign', 'Sagohamnen\campaign\campaign_players', 'user_id', 'id');
 

Schema::create('sh_users', function (Blueprint $table) 
        $table->increments('id')->unsigned();
        $table->string('name', 255);
);

广告系列

protected $table = 'sh_campaigns';

Schema::create('sh_campaigns', function (Blueprint $table) 
        $table->increments('id')->unsigned();
        $table->string('name', 255);               
        $table->timestamps();
);

Campaign_players

protected $table = 'sh_campaign_players';

Schema::create('sh_campaign_players', function (Blueprint $table) 
        $table->integer('user_id')->unsigned();
        $table->integer('campaign_id')->unsigned();
        $table->date('date');
        $table->primary(['user_id', 'campaign_id']);
);

【问题讨论】:

看起来这里可能有一些问题。您得到的第一个错误是表campaign_players 不存在。从您发布的代码看来,您已将表命名为 sh_campaign_players 感谢您的评论。是的,我写了模型的名称,叫做campaign_players。你的意思是我应该写 mysql 表名而不是模型? @Ruffles 关于如何传递表名的说法是正确的。此外,我鼓励您阅读 Laravel docs。有一些鼓励的约定。比如在这种情况下调用数据透视表campaign_user 谢谢。我考虑将其更改为campaign_users,但我认为campaign_player 更符合我的目的。 我当然同意根据您的情况命名事物是一个好主意。由于它是 Laravel 的约定,例如,如果您要使用 campaign_user,您只需将一个参数传递给您的 belongsToMany,Laravel 将暗示其余的,而不是您需要明确说明所有内容。 [而且您仍然可以将方法命名为您认为合适的名称,例如 campaignsPlaying]。但同样,只是一个建议,做对你的情况有意义的事情:) 【参考方案1】:

将透视表名称作为第二个参数传递给 belongsToMany() 方法。它要求一个字符串,而不是模型类路径。

Sagohamnen\campaign\campaign_players 更改为sh_campaign_players(或数据库中数据透视表的名称)

【讨论】:

以上是关于未找到 Laravel 数据透视表的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 如何创建数据透视表?

如何创建数据透视表 laravel?

如何通过laravel创建数据透视表

可以将数据透视表与 laravel 5.5 中的另一个数据透视表相关联吗?

试图在资源 Laravel 中返​​回数据透视表

Laravel Eloquent - 查询数据透视表