我有一个包含此迁移架构的表
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()
。
如何使用雄辩的关系替换此查询。
答案 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;
}