@NewSantaClaus

Как составить запрос из динамического имени таблицы в Laravel?

Есть запрос (рабочий)

SELECT
	(
		CASE
			WHEN t.source = 'viber' THEN (SELECT vu.token FROM viber_users vu WHERE vu.id = t.field_id)
			WHEN t.source = 'telegram' THEN (SELECT tu.token FROM telegram_users tu WHERE tu.id = t.field_id)
		END
	) AS token
FROM
	table t


Но я стремлюсь сделать его более универсальным. То есть, при ситуации что source может стать еще каким-то, к примеру, facebook, мне не пришлось править текущий запрос. Но я стремлюсь избежать такой ситуации

По итогу я хочу получить что-то вроде:
SELECT
	(
		SELECT
			tu.token
		FROM
			CONCAT(t.source, '_users') tu
		WHERE
			tu.id = t.field_id
	) AS token
FROM
	table t


Да, я понимаю то такой вариант работать не будет, и по хорошему мне бы назначить переменную

SET @table = 'viber_users';

SELECT
	(
		SELECT
			tu.token
		FROM
			@table tu
		WHERE
			tu.id = t.field_id
	) AS token
FROM
	table t


Но здесь я стал в ступор. Мне нужно назначать эту переменную в подзапросе, к тому же первая часть таблицы это поле родительской таблицы, и только вторая часть дефолтная.

Подскажите, как мне закончить запрос и перевести на laravel Facades DB?
  • Вопрос задан
  • 88 просмотров
Пригласить эксперта
Ответы на вопрос 1
iMedved2009
@iMedved2009
Не люблю людей
А не проще ли будет не расскидывать одну и ту же сущность по разным таблицам? Ну то есть сделать таблицу social_users с полями user_id, social_type, token? И тогда все сведется к нормальным join?

З.Ы. В рамках ларки можно конечно поиграться со связями. Как нибудь так
public function social(){

        $class = Str::camel(Str::singular($this->source));
        $instance = $this->newRelatedInstance($class);

        $foreignKey = 'id';
        $localKey = 'field_id';

        return $this->newHasOne($instance->newQuery(), $this, $instance->getTable().'.'.$foreignKey, $localKey);
    }


 И будет работать $model->social. Но eager loading сдохнет к херам
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы