与Laravel的一对多关系

时间:2018-02-22 14:42:51

标签: php laravel

好的,我必须在这里找不到简单的东西。

我有' kjv'表,每一行都是kjv圣经的一节经文:

CREATE TABLE `kjv` (
  `id` int(11) NOT NULL,
  `book` varchar(140) COLLATE utf8mb4_unicode_ci NOT NULL,
  `chapter` smallint(6) DEFAULT NULL,
  `verse` int(11) DEFAULT NULL,
  `contents` mediumtext COLLATE utf8mb4_unicode_ci
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

我还有一个评论表,每一行都有一个特定经文的评论。

CREATE TABLE `commentary` (
  `id` int(11) NOT NULL,
  `kjv_id` int(11) NOT NULL,
  `note` mediumtext COLLATE utf8mb4_unicode_ci NOT NULL,
  `type` tinyint(4) NOT NULL COMMENT 'BOOL',
  `intro` tinyint(1) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

好。所以,据我所知,我可以在我的KJVController中以这种方式获取commantary:

$results =   KJV::where('book', '=', $this->book)
            ->where('chapter', '=', $this->chapter)
            ->leftJoin('commentary', 'kjv.id', '=', 'kjv_id')
            ->get();
dd($results);

这很棒,但是当我显示结果时,我不会得到多个评论。

所以,as per this example我在KJV模型中添加了这个函数:

class KJV extends Model
{
    protected $table = "kjv";
    function commentary() {
        return $this->hasMany(Commentary::class);
    }
}

在我的KJVController中添加了use App\Commentary;。现在再次,根据示例,我应该能够在->comments查询中的某处引用KJV::where,并删除leftJoin。但无论我做什么,我都会遇到错误。

1 个答案:

答案 0 :(得分:2)

您将能够像这样访问它们:

KJV::where('book', $this->book)->where('chapter', $this->chapter)->first()->commentary

您不需要get()和旁注:您无需在=内指定where

PS:确保评论的kjv_id设置为您要检索的KJV ID。

PS 2:如果您想要检索多个kjv的所有评论,您可以按照以下步骤操作:

KJV::where('book', $this->book)->where('chapter', $this->chapter)->with('commentary')->get()