【问题标题】:Error when trying to use eloquent relationships尝试使用雄辩的关系时出错
【发布时间】:2022-01-15 07:41:30
【问题描述】:

我花了几个小时试图解决这个问题,但我只是不明白我做错了什么。

我想获取我的帖子 id 与表 bewerbungens 的 id 相同的表的所有条目。

所以我得到了每个用户的所有应用程序,以及用户申请的帖子的相应标题。

我之前在这里问过一个问题,并获得了添加关系的资源,我做到了,如下所示:

Bewerbungen 型号:

protected $fillable = [
    'bewerber_email',
    'Stellenanzeigen_ID',
    'is_Accepted',
    'accept_Date',
    'is_Canceled',
    'cancel_Date',
    'is_Received',
    'receive_Date',
    'is_Canceled_Bewerber',
    'cancel_Date_Bewerber',
    'lebenslauf_File',
    'zeugnis_File',
    'anschreiben_File',
    'weitere_Doks',
];

public function post() {
    return $this->belongsTo('Post', 'Stellenanzeigen_ID', 'Bewerbung_ID');
}

在我的 Post 模型中:

protected $fillable = [
        'titel',
        'startdate',
        'enddate',
        'beschreibung',
        'standort',
        'type_name',
        'abteilung_name',
        'kontakt',
        'isActive',
        'lebenslauf',
        'zeugnisse',
        'anschreiben',
        'weitere_Doks',
        'is_Permitted',
        'job_start',
    ];

    public function bewerbungen() {
        return $this->belongsToMany(Bewerbungen::class);
    }

这是我尝试获取条目的控制器代码:

   $dummy = Post::with('Bewerbungen.post')->get();

但我得到了错误: SQLSTATE[42S02]:未找到基表或视图:1146 表“portal.bewerbungen_post”不存在(SQL:选择bewerbungens.*、bewerbungen_post.post_idpivot_post_idbewerbungen_post.@ 987654329@ as pivot_bewerbungen_id from bewerbungens inner join bewerbungen_post on bewerbungens.id = bewerbungen_post.bewerbungen_id where bewerbungen_post.post_id in (1, 2, 4))

我也试过这个:

    $dummy = Post::where('id', 'Stellenanzeigen_ID')->get();

但它只是返回一个空集。

我该如何解决这个问题?

编辑:发布模型

protected $fillable = [
        'titel',
        'startdate',
        'enddate',
        'beschreibung',
        'standort',
        'type_name',
        'abteilung_name',
        'kontakt',
        'isActive',
        'lebenslauf',
        'zeugnisse',
        'anschreiben',
        'weitere_Doks',
        'is_Permitted',
        'job_start',
    ];

    public function location() {
        return $this->hasOne(Standort::class);
    }

    public function job_type() {
        return $this->hasOne(Jobtypes::class);
    }

    public function bewerbungen(): BelongsToMany
    {
        return $this->belongsToMany(Bewerbungen::class, 'bewerbungens');
    }

我有评论中建议的 bewerbungen() 方法,我只是在玩弄它,所以它看起来不同,但它目前没有使用,因为它不起作用

【问题讨论】:

  • 你能用$dummy = Post::with('Bewerbungen.post')->toSql();检查SQL吗?它会给你SQL查询,你可以直接在数据库工具中运行。
  • @SuryapalRao 我得到这个然后:“从posts 中选择* Bewerbungen.post 为空”

标签: php mysql laravel


【解决方案1】:

SQL 错误表示没有 bewerbungen_post 表,因为您使用的 belongsToMany 只有一个参数。如here 所述,如果您的关系的中间表名称与 Laravel 行为不同,则将关系的中间表名称添加到第二个参数,否则 Laravel 将连接两个表作为关系表的名称。例如:

public function bewerbungen() {
    return $this->belongsToMany(Bewerbungen::class, 'bewerbungen_post');
}

我检查了你之前的问题,我认为Post 模型直接加入了Bewerbungen 模型,所以Post 模型中的关系应该是这样的:

public function bewerbungens(): HasMany
{
    // It's mean that `Post` has many `Bewerbungen` where `Stellenanzeigen_ID` = `posts.id`
    return $this->hasMany(Bewerbungen::class, 'Stellenanzeigen_ID', 'id'); 
}

在 Bewerbungen 模型中:

public function post(): BelongsTo
{
    // It's mean that `Bewerbungen` owned by Post as `Stellenanzeigen_ID` = `posts.id`
    return $this->belongsTo(Post::class, 'Stellenanzeigen_ID', 'id');
}

如果您想获得Post 以及Posts 拥有的所有Bewerbungen

// You will get All Post with all Bewerbungen each Post
$posts = Post::with('bewerbungens')->get();

反之亦然:

// You will All Bewerbungen and One Post for every Bewerbungen
$bewerbungen = Bewerbungen::with('post')->get();

有关关系的所有详细信息都可以在Laravel Documentation中找到。

【讨论】:

  • 哇,感谢您的详细回答!我现在试试 :) 只有一个问题,如果我从数据库中删除表,更改关系然后重新运行迁移,是否可以?还是我需要全新的迁移文件?
  • 遗憾的是,我收到此错误消息:在尝试 $posts = Post::with('bewerbungens')->get() 时调用模型 [App\Models\Post] 上的未定义关系 [bewerbungens] ;
  • @newbie 嗯……这很奇怪。当您创建一个方法并返回一个关系类时,应该创建该关系。 Bewerbungen 模特怎么样?是否像 Post 模型一样出错?你能告诉我你的完整模型的代码吗?
  • 抱歉睡着了 :D Bewerbungen 工作正常,我现在开始工作了。昨天晚上我不完全明白为什么,所以我去睡觉了,现在我刚刚启动 phpstorm :D 我会用完整的模型更新帖子!
  • @newbie 我认为您在Post 模型中需要的是hasMany,而不是belongsToMany,不是吗? (就像我的第二个代码,而不是第一个)。因为,您的PostBewerbungen 之间的关系是Post.id = Bewerbungen.Stellenanzeigen_ID 对吗?如果是这样,则意味着 Post 将拥有多个 Bewerbungen,而 Bewerbungen 将只属于一个 Post。
猜你喜欢
  • 1970-01-01
  • 2019-05-10
  • 1970-01-01
  • 2017-05-16
  • 2021-12-15
  • 1970-01-01
相关资源
最近更新 更多