获取雄辩模型关系的数组

2022-08-30 13:07:31

我正在尝试获取模型的所有关联的数组。我有以下模型:

class Article extends Eloquent 
{
    protected $guarded = array();

    public static $rules = array();

    public function author() 
    {
        return $this->belongsTo('Author');
    }

    public function category() 
    {
        return $this->belongsTo('Category');
    }
}

从这个模型中,我试图得到它的关系的以下数组:

array(
    'author',
    'category'
)

我正在寻找一种方法来自动从模型中拉出此数组。

我在 Eloquent 模型上发现了 relationsToArray 方法的这个定义,它似乎返回了模型关系的数组。它似乎使用了 Eloquent 模型的 $this->relations 属性。但是,此方法返回一个空数组,并且 relations 属性是一个空数组,尽管我的关系设置正确。

如果不存储模型关系,$this->关系用于什么?有没有办法自动获取模型关系的数组?


答案 1

这是不可能的,因为仅当使用(对于预先加载)或使用模型中定义的关系公共方法请求关系时才会加载关系,例如,如果使用以下关系创建模型withAuthor

public function articles() {
    return $this->hasMany('Article');
}

当您调用此方法时,如下所示:

$author = Author::find(1);
$author->articles; // <-- this will load related article models as a collection

另外,正如我所说,当您使用类似这样的东西时:with

$article = Article::with('author')->get(1);

在这种情况下,第一篇文章(ID为1)将加载其相关模型,您可以使用Author

$article->author->name; // to access the name field from related/loaded author model

因此,如果不使用适当的方法来加载关系,就不可能神奇地获取关系,但是一旦加载关系(相关模型),您就可以使用类似这样的东西来获取关系:

$article = Article::with(['category', 'author'])->first();
$article->getRelations(); // get all the related models
$article->getRelation('author'); // to get only related author model

要将它们转换为,您可以使用如下方法:arraytoArray()

dd($article->getRelations()->toArray()); // dump and die as array

该方法适用于加载了其相关模型的模型。此方法将相关模型转换为数组形式,其中方法将模型(具有关系)的所有数据转换为数组,下面是源代码:relationsToArray()toArray()

public function toArray()
{
     $attributes = $this->attributesToArray();

     return array_merge($attributes, $this->relationsToArray());
}

它合并模型属性,并在转换为数组后合并其相关模型的属性,然后返回它。


答案 2

使用这个:

class Article extends Eloquent 
{
    protected $guarded = array();

    public static $rules = array();

    public $relationships = array('Author', 'Category');

    public function author() {
        return $this->belongsTo('Author');
    }

    public function category() {
        return $this->belongsTo('Category');
    }
}

所以在课堂之外,你可以做这样的事情:

public function articleWithAllRelationships()
{
    $article = new Article;
    $relationships = $article->relationships;
    $article = $article->with($relationships)->first();
}

推荐