计划在Laravel 5中雄辩的关系

时间:2015-10-03 12:37:14

标签: laravel-5 eloquent

我有一个Project模型。每个Project可以具有缩略图,主图像和其他多个资产/图像(例如项目细节)以及多个文本内容(将放置在这些图像之间)。每个Project页面将引入这些资源(缩略图除外)和文本,并按特定顺序显示它们(我通过拖放控制面板定义)。

所以基本上与Behance使用的结构类似。我正在尝试使用Eloquent来构建这个,这就是我想要做的事情:

我可以在Asset模型上说TexthasMany()模型与Project关系。这两个模型将有一个名为pageSort的列,然后控制器将这两个集合合并在一起,并使用pageSort列对它们进行排序。

还有其他建议吗?

编辑:

我试图在Laravel中使用多态关系,但还没有成功。

我的Project型号:

public function nodes()
{
    return $this->morphedByMany(Node::class, 'nodeable');
}

我的Node型号:

public function nodeable()
{
    return $this->morphTo();
}

然后在我的代码中,我执行以下操作:

$project = new App\Project;
$project->title = 'Some title';
$project->save();

$image = new App\Image;
$image->source = 'somefile.jpg';

$项目 - >节点() - >保存($图像);

但是我收到以下错误:

Illuminate\Database\QueryException with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column 'project_id' in 'field list' (SQL: insert into `nodeables` (`nodeable_id`, `nodeable_type`, `project_id`) values (5, App\Node, 1))'

所以我猜它正试图在数据透视表nodeables中创建一个条目。然后我创建了这个表,并在数据透视表中保存了一个条目,但不在nodes表内。

这让我很生气! :(

1 个答案:

答案 0 :(得分:0)

我会有一个多态的Node模型,并且有sort_order列。 Project会有很多Node个模型,Node可以变换为您需要的任何内容:TextImageVideo和等等。

class Project extends Model
{
    public function nodes()
    {
        return $this->hasMany(Node::class)->orderBy('sort_order');
    }
}

class Node extends Model
{
    public function nodeable()
    {
        return $this->morphTo('nodeable');
    }

    public function project()
    {
        return $this->belongsTo(Project::class);
    }
}

// Example
class Text extends Model
{
    public function node()
    {
        return $this->morphOne(Node::class);
    }
}