Laravel得到Model兄弟和自我 - 这是正确的方法吗?

时间:2018-06-15 14:58:55

标签: laravel laravel-5 eloquent

我有一个具有这些功能的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,我很好奇这是否是检索结果的正确方法。

或者您会建议另一种检索所有相关记录和自我的方法吗?

2 个答案:

答案 0 :(得分:1)

取决于您愿意对数据做些什么,但您可以使用eager loading使您的查询看起来更好。

$package = Package::where('id', 5)->with(['parent', 'childs'])->get();

现在,您可以使用parentchild属性查找相关数据

// 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 );
}

但是,如果你想在多个模型上使用它,你应该首先加载parentchilds关系以避免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
}