Модель Laravel Eloquent с использованием нескольких таблиц, объединенных в одну (без отдельных моделей) - PullRequest
0 голосов
/ 30 мая 2018

Я работаю над REST API с Slim и Eloquent.Я использовал Medoo DB раньше.Это работало хорошо, но я хотел убрать статическую схему и стать более гибким.

У меня есть таблица БД с информацией о продукте.Проблема в том, что у меня есть еще много таблиц с информацией о продукте.Они не используются сами по себе, а только в сочетании с продуктом.

Так что не имеет смысла создавать классы Eloquent Relationship и модель для каждой дополнительной таблицы, потому что они никогда там не будут использоваться.своя.Фактически это одна таблица, распределенная по нескольким таблицам.

Я знаю, что лучше всего было бы изменить структуру БД и создать одну большую таблицу, но я не могу сделать это прямо сейчас.

Итакв 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 ...

1 Ответ

0 голосов
/ 30 мая 2018

Я решил это до сих пор, вставив метод области видимости, который объединяет другие таблицы.Может быть, у кого-то есть способ получше?

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

, а потом

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