, это не работает.

ичок в Laravel. Я пытаюсь использовать Eloquent Model для доступа к данным в БД.

У меня есть таблицы, которые имеют общие черты, такие как имя таблицы.

Поэтому я хочу использовать одну модель для доступа к нескольким таблицам в БД, как показано ниже, но без везения.

Есть ли способ установить имя таблицы динамически?

Любые предложения или советы будут оценены. Заранее спасибо.

Модель:

class ProductLog extends Model
{

    public $timestamps = false;

    public function __construct($type = null) {

        parent::__construct();

        $this->setTable($type);
    }
}

контроллер:

public function index($type, $id) {

    $productLog = new ProductLog($type);

    $contents = $productLog::all();

    return response($contents, 200);
}

Решение Для тех, кто страдает той же проблемой:

Мне удалось изменить имя таблицы по предложению @Mahdi Younesi.

И я смог добавить, где условия, как показано ниже

$productLog = new ProductLog;
$productLog->setTable('LogEmail');

$logInstance = $productLog->where('origin_id', $carrier_id)
                          ->where('origin_type', 2);
 Ohgodwhy27 дек. 2017 г., 06:24
Если это абсолютно необходимо, вы можете переопределитьgetTable метод, но вы можете использовать Query Scopes и установить имя таблицы внутри них.
 smchae27 дек. 2017 г., 06:19
Да. Только для определенных таблиц; таблицы с похожими атрибутами.
 Prateik Darji27 дек. 2017 г., 06:14
Итак, вы хотите каждый раз передавать разные имена таблиц?
 Himanshu Upadhyay27 дек. 2017 г., 06:21
Я могу предложить вам создать модели для всех таблиц, но я могу сказать вам общую функцию, которая будет создавать объект любой модели, передавая только имя модели этой функции, и вы получите объект модели динамически.

Ответы на вопрос(1)

Решение Вопроса

Следующая черта позволяет передавать имя таблицы во время гидратации.

trait BindsDynamically
{
    protected $connection = null;
    protected $table = null;

    public function bind(string $connection, string $table)
    {
       $this->setConnection($connection);
       $this->setTable($table);
    }

    public function newInstance($attributes = [], $exists = false)
    {
       // Overridden in order to allow for late table binding.

       $model = parent::newInstance($attributes, $exists);
       $model->setTable($this->table);

       return $model;
    }

}

Вот как это использовать:

class ProductLog extends Model
{
   use BindsDynamically;
}

Вызовите метод в следующем примере:

public function index() 
{
   $productLog = new ProductLog;

   $productLog->setTable('anotherTableName');

   $productLog->get(); // select * from anotherTableName


   $productLog->myTestProp = 'test';
   $productLog->save(); // now saves into anotherTableName
}
 smchae27 дек. 2017 г., 08:02
Это меняет имя таблицы, но после того, как я использую$productLog->setTable('anotherTableName');если бы я должен был использовать$productLog->where('some query'), это не работает.

Ваш ответ на вопрос