Laravel模型非强制性FK MySQL

时间:2015-01-30 10:33:33

标签: mysql laravel eloquent

关于Laravel的简单问题。如果我在mySQL中有一个分层表(层次结构,因为它是一个自递归表,这意味着它的一列引用了另一个列的自己的列

TABLE site_tree
INT page_id
INT parent_page_id (references site_tree.page_id)

这种关系的模型雄辩关系类型是什么?

问题2:

TABLE site_tree
INT page_id NULL

FOREIGN KEY REFERENCES page.page_id NON-MANDATORY

TABLE page
INT page_id

在这种非强制性关系中,site_tree中的page_id可以为null,我将使用哪种雄辩的关系类型?

1 个答案:

答案 0 :(得分:2)

如果我理解正确(我可能不会),这是你的答案:

问题1:

  • site_tree belongsTo site_tree(父母关系)
  • site_tree hasMany site_tree(子关系)

所以他们倾向于模仿这些就像这样:

<?php
use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
    public function parent()
    {
        return $this->belongsTo('Category', 'category_id');
    }

    public function children()
    {
        return $this->hasMany('Category', 'category_id');
    }
}

事实上,我实际上有一个特性,任何类似树的模型都可以使用,它具有这些方法的更通用版本,如下所示:

<?php
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;

trait Tree
{
    public function parent()
    {
        return $this->belongsTo(get_called_class(), $this->getForeignKey());
    }

    public function children()
    {
        return $this->hasMany(get_called_class(), $this->getForeignKey());
    }

    public function scopeTopLevel(Builder $query)
    {
        return $query->whereNull($this->getForeignKey());
    }
}

还有一些额外的方便方法,例如isLeafgetAncestorsgetSiblingsgetDescendants等。

问题2:

这同样适用,但现在它只是一个不同的表格(外键字段的无法实现的问题确实不是一个问题假设我正确理解你的问题< / em>)因为Laravel将为关系返回一个空资源或空集合。我说虽然通常如果你在两张桌子上有这种关系,你通常会强制执行这种关系,因为任何通常属于其他东西的东西都不会独立存在,但是你的用例是你的用例。以下是课程:

<?php
use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
    use Tree; // the tree behaviour from above

    public function products()
    {
        return $this->hasMany('Product');
    }
}

<?php
use Illuminate\Database\Eloquent\Model;

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

在这种情况下,我会强制执行product belongsTo category关系,但category_id可以是null,以获得最高级别&#39 ;类别/类别。