Laravel Eloquent 模型使用多个表合并为一个(没有单独的模型)

Posted

技术标签:

【中文标题】Laravel Eloquent 模型使用多个表合并为一个(没有单独的模型)【英文标题】:Laravel Eloquent Model using multiple tables combined into one (no separate models) 【发布时间】:2018-05-30 15:59:18 【问题描述】:

我正在使用 Slim 和 Eloquent 开发 REST API。 我以前用过 Medoo DB。它运行良好,但我想删除静态模式并变得更加灵活。

我有一个包含产品信息的数据库表。问题是我有更多包含产品信息的表格。这些不是自己使用的,而是与产品结合使用的。

因此,为每个子表创建 Eloquent 关系类和模型是没有意义的,因为它们永远不会单独使用。它实际上是一个表扩展了多个表。

我知道最好的办法是更改数据库结构并创建一个大表,但我现在不能这样做。

所以在 Medoo 中,我定义了一个模式结构,其中包含所有可连接的表和一个选择一个产品的查询。就像我说的那样,我想保持灵活性而不是在代码中定义模式,但目前我只能从主表中选择数据。

所以这里只是产品型号:

<?php
namespace Product\Models;

use Interop\Container\ContainerInterface;
#use Medoo\Medoo;
use \Illuminate\Database\Query\Builder;
use \Illuminate\Database\Eloquent\Model as Model;
use \Illuminate\Database\Capsule\Manager;

use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;


class Object extends Model

    protected $database;

    public function __construct($database)
               
        $this->setTable('product_objects');
        $this->database = $database;
    

    public function getObjectById($id) 

        /*       
        $data = $this->database
            ->table('product_objects')
            ->get($columns)
            ->first()
            ;
        */

        $data = $this->find($id); // this works (with one table)


        // Throw error if no result found.
        if (empty($data)) 
            throw new \Exception('No object found', 400);
                

        return $data;
    


// this was just a test
class Freetext extends Model

    protected $database;

    public function __construct($database)
               
        $this->setTable('product_freetext');
        $this->database = $database;
    

是否可以这样做:

$data = $this->find($id)->product_freetext->product_table3->product_table4 ...

【问题讨论】:

在我看来,创建额外的类和添加关系实际上是有意义的,因为这些表是真实存在的,并且它们与Products 表相关。 额外的表格只是附加信息。他们永远不会被要求自己,没有主产品表就没有任何意义。 【参考方案1】:

到目前为止,我通过插入连接其他表的范围方法解决了这个问题。 也许有人有更好的方法?

public function scopeObjects($query) 
  return $query->join('product_freetext', 'product_freetext.oid', '=', 'product_objects.id');

然后

$data = $this->objects()->find($id);

【讨论】:

以上是关于Laravel Eloquent 模型使用多个表合并为一个(没有单独的模型)的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.2 pluck() 来自 Eloquent 模型集合的多个属性

Laravel 5.4:使用eloquent和fillable字段更新多个表的多个模型

使用laravel框架的eloquent模型连接多个数据库

Laravel/Eloquent - 创建与可能具有或不具有属性的父模型相关的多个子模型的关系

一个模型和多个模型之间的 Laravel Eloquent 关系作为 MorphOne?

Laravel Eloquent - 一张桌子的多个模型