使用单表的Laravel关系

时间:2013-12-13 13:43:42

标签: orm laravel laravel-4 eloquent

我有一个包含此迁移架构的表

Schema::create('pages', function(Blueprint $table) {
   $table->integer('id', true);
   $table->string('title');
   $table->string('slug');
   $table->string('layout');
   $table->text('body');
   $table->integer('parent_id');
   $table->integer('page_order');
   $table->enum('is_navigation', array('yes', 'no'))->default('yes');
   $table->timestamps();
   $table->softDeletes();
});

此表用于保存动态多级页面详细信息。如果页面是父页面,则parent_id将为零,如果页面位于另一页面下,则其父页面标识为parent_id。现在我需要在表格中显示数据父母头衔。我的代码是,

$table_prefix = DB::getTablePrefix();

$pages = DB::select(DB::raw("select A.*,B.title as parent from ".$table_prefix."pages as A left join ".$table_prefix."pages as B on A.parent_id = B.id where A.deleted_at is null"));

它工作正常,但我不能在这里使用paginate()

如何使用雄辩的关系替换此查询。

2 个答案:

答案 0 :(得分:0)

您可以在那里使用paginate()。看看documentation

DB::table('pages')
    ->select("pages.*", "parent_pages.title as parent")
    ->leftJoin('pages as parent_pages', 'parent_pages.id = pages.parent_id')
    ->where('pages.deleted_at', '=', null)
    ->paginate(10);

您也可以使用雄辩的方式删除trashed where子句,因为eloquent应该处理它。

Page::where("pages.*", "parent_pages.title as parent")
    ->leftJoin('pages as parent_pages', 'parent_pages.id = pages.parent_id')
    ->paginate(10);

未经测试,只重新考虑原始查询字符串

答案 1 :(得分:0)

这是正确的ORM方法。首先在模型中定义关系。然后在查询期间急切加载关系。通过急切加载,这发生在两个SQL查询中。一个用于页面列表,另一个用于所有页面父项。

// In Page class

public function parent()
{
    return $this->belongsTo('Page', 'parent_id');
}

// Elsewhere

$pages = Page::with('parent')->paginate(10);

foreach ($pages as $page)
{
    if ($page->parent)
    {
        echo $page->parent->title;
    }

    echo $page->title;
}