我有一个具有这些功能的Eloquent模型:
<?php
class Package extends Model
{
public function parent()
{
return $this->belongsTo( Package::class, 'parent_id' );
}
public function childs()
{
return $this->hasMany( Package::class, 'parent_id' );
}
/**
* All packages that belongs to each other
*/
public function siblings_and_self()
{
$result = $this->newCollection()->add( $this );
$result = $result->merge( $this->parent()->get() );
$result = $result->merge( $this->childs()->get() );
return $result;
}
}
关于最后一个函数siblings_and_self
,我很好奇这是否是检索结果的正确方法。
或者您会建议另一种检索所有相关记录和自我的方法吗?
答案 0 :(得分:1)
取决于您愿意对数据做些什么,但您可以使用eager loading使您的查询看起来更好。
$package = Package::where('id', 5)->with(['parent', 'childs'])->get();
现在,您可以使用parent
和child
属性查找相关数据
// The id of the current package
echo $package->id;
// The id of the parent package
echo $package->parent->id;
// The id of the first child package
echo $package->childs->first()->id;
答案 1 :(得分:1)
我认为应该改进。
而不是:
$result->merge( $this->parent()->get() );
你应该使用:
$result->merge([$this->parent]);
也代替
$this->childs()->get()
你可以使用:
$this->childs
所以最后你可以简化它并使用:
public function siblings_and_self()
{
return $this->newCollection([$this, $this->parent])->merge( $this->childs );
}
但是,如果你想在多个模型上使用它,你应该首先加载parent
和childs
关系以避免n+1
查询问题,如下所示:
// here you eager load
$packages = Package::with('parent', 'childs')->get();
// and now you can use it
foreach ($packages as $package)
{
$siblings_and_self = $package->siblings_and_self();
// and now you can do something with this variable
}