建立雄辩关系的正确方法

时间:2017-09-26 10:01:03

标签: php laravel-5.4 laravel-eloquent

我意识到这样的问题可能令人困惑且难以理解,但我会尽力解释我的问题。

我想做的事情:显示正在播放某个剧场的所有日子。

我拥有的内容:到目前为止已执行所有播放的表格,以及包含所有日期的表格(包括指向每行中相关播放的外键)

enter image description here

enter image description here

以下是我如何建立两者之间的关系:

Days.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Days extends Model
{
    public function play()
    {
        return $this->belongsTo('App\Plays', 'play_id');
    }
}

Plays.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Plays extends Model
{
    public function days()
    {
        return $this->hasMany('App\Days');
    }
}

最后,这就是我试图在视图中显示相关日期的方式:

<ul>
    @foreach($play->days() as $day)
    <li class="text-center text-muted">{{ $day->day }}</li>
    @endforeach
</ul>

我得到的结果:没有任何<li>标签的无序列表,好像根本没有天。

我以前在Eloquent关系方面遇到了麻烦,但从那时起它没有向我显示任何错误,我不知道到底是什么错。 此外,我将 $ play 值传递给视图的方式也是正确的,因为我引用它并在同一文件中成功地多次询问其值。

非常感谢您的时间和帮助!

3 个答案:

答案 0 :(得分:1)

将您的班级名称更改为单数名词(Play,Day)或在hasMany关系中指定外键。 Laravel尝试从类名中猜出外键名,在这种情况下,它会尝试通过plays_id键查找天数。

答案 1 :(得分:1)

定义关系后,我们可以使用Eloquent的动态属性检索相关记录。 在循环中尝试 $ play-&gt;天而不是 $ play-&gt; days()

答案 2 :(得分:0)

最后,结果证明这是既有答案又有Dmitri的答案:

我指定了在两个模型中使用哪个外键,因为在我使用它们的任何位置重命名它们会花费很长时间:

播放模型

public function days()
{
    return $this->hasMany('App\Days', 'play_id');
}

天模型

public function play()
{
        return $this->belongsTo('App\Plays', 'play_id');
}

之前,我只在几天内完成了这项工作,但显然需要在两者中完成。

另外,删除括号修复了最后几个问题,谢谢你们两个!