Laravel Join запросы при использовании префикса в настройках таблицы

mstdmstd

Новичок
Всем привет.
хочу сделть свой код в laravel 5.7 приложении работающим с указанным префиксом в настройке базы.
Без указания префикса работал такой запрос с join-ом :
PHP:
            $nextVote = Vote
                ::where(with(new Vote)->getTable() . '.id', $nextTempTagRelatedVote->taggable_id)
                ->getByStatus('A')
                ->leftJoin(\DB::raw('vote_categories'), \DB::raw('vote_categories.id'), '=', \DB::raw('votes.vote_category_id'))
                ->select(\DB::raw(" votes.*, votes.image as vote_image, vote_categories.name as vote_category_name, vote_categories.slug as vote_category_slug"))
                ->get()
                ->first();

После того как я указал префикс в настройках базы заработал такой код
PHP:
            $prefix= \DB::getTablePrefix();
            $nextVote = Vote
                ::where(with(new Vote)->getTable() . '.id', $nextTempTagRelatedVote->taggable_id)
                ->getByStatus('A')
                ->leftJoin('vote_categories', 'vote_categories.id', '=', 'votes.vote_category_id')
                ->select( \DB::raw($prefix."votes.*, ".$prefix."votes.image as vote_image, ".$prefix."vote_categories.name as vote_category_name, ".$prefix."vote_categories.slug as vote_category_slug") )
                ->get()
                ->first();

Без использлвания \DB::raw я получал ошибку из-за удвоенного префикса, но без $prefix в указании списка полей не работает

Похоже что метод >select( префикс с именованные поля не подсктавляет

Получается что запрос с префиксом хоть и работает, но получилось менгее читаемо.

А как делаете вы ?

Спасибо!
 

jonjonson

Охренеть
Пробовали в моделях указать названия таблиц с префиксами?
 

mstdmstd

Новичок
Пробую и не получается:
У меня модели наследуются от общей модели
app/Vote.php :
PHP:
<?php

namespace App;

use DB;
use App\MyAppModel;

class Vote extends MyAppModel
{
    use LogsActivity;
    protected $primaryKey = 'id';

    public function __construct()
    {
    // И если добавить префикс к имени таблицы в конструкторе
        $this->table = \DB::getTablePrefix().'votes';
    }
То получаю ошибку:
Код:
Base table or view not found: 1146 Table 'Vt.vt_vt_votes' doesn't exist
в обоих запросах выше. То есть префикс приаттачивается дважды в таком случае...
Или Вы имели в виду как-то иначе ?
 

mstdmstd

Новичок
Немного поэксперементировав получил способ работы с префиксом для обьеденения 2х таблиц я завел 4 переменные имени таблиц как с префиком так и без него:
PHP:
class VotesController extends MyAppController
{
    private $votes_tb;
    private $vote_categories_tb;
    private $prx_votes_tb;
    private $prx_vote_categories_tb;

    public function __construct()
    {
        $this->votes_tb= with(new Vote)->getTable();
        $this->vote_categories_tb= with(new VoteCategory())->getTable();

        $this->prx_votes_tb= \DB::getTablePrefix().with(new Vote)->getTable();
        $this->prx_vote_categories_tb= \DB::getTablePrefix().with(new VoteCategory())->getTable();
    }
И тогда я могу составить запрос :
Код:
            $nextVote = Vote
                ::where($this->votes_tb . '.id', $nextTempTagRelatedVote->taggable_id)
                ->getByStatus('A')
                ->leftJoin($this->vote_categories_tb, $this->vote_categories_tb.'.id', '=', $this->votes_tb.'.vote_category_id')
                ->select( \DB::raw($this->prx_votes_tb.".*, ".$this->prx_votes_tb.".image as vote_image, ".$this->prx_vote_categories_tb.".name as vote_category_name, ".$this->prx_vote_categories_tb.".slug as vote_category_slug")  )
                ->get()
                ->first();
Который рендерится в нужный запрос:

Код:
   SELECT vt_votes.*, vt_votes.image     AS vote_image, vt_vote_categories.name     AS vote_category_name, vt_vote_categories.slug     AS vote_category_slug
    FROM `vt_votes`
    LEFT JOIN `vt_vote_categories` on `vt_vote_categories`.`id` = `vt_votes`.`vote_category_id`
    WHERE `vt_votes`.`id` = '2'     AND `vt_votes`.`status` = 'A'
Как я понял при составлении запроса в where и leftJoin префиксм будет добален автоматически
но в наименование колонок select нет - отчего и такое нагромождение
Что кажется тяжелее читать...
Наверно, можно сделать лучше ?
 

mstdmstd

Новичок
Если в одну базу загрузить таблицы из нескольких приложений и избежать пересечения скажем таблицы users из разных приложений.
Иногда такая необходимость есть.
 

jonjonson

Охренеть
В модели тупо прописывается имя таблицы. И у каждого приложения своя модель для своей таблицы.
Получается, что префикс на уровне кода уже не нужен.
 

mstdmstd

Новичок
Если делать запрос по одной таблице - то да префикс не нужен
Если делать join с выбором полей из разных таблиц как в моем примере то получается что нужен...
Хотя возможгл я что-то делаю не так что я и пытаюсь выяснить...
 

mstdmstd

Новичок
В модели тупо прописывается имя таблицы. И у каждого приложения своя модель для своей таблицы.
Получается, что префикс на уровне кода уже не нужен.
Вы join-ы в своих приложениях используете ? Попробуйте их сделать с префиксынми именами ...
 

jonjonson

Охренеть
В модели можно указать имя таблицы. Все запросы строятся на его основе. Причём тут префикс?
Код:
<?php namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
    /**
     * The table associated with the model.
     *
     * @var string
     */
    protected $table = 'my_flights';
}
 

mstdmstd

Новичок
Блин и тогда префикс в настройках базы заполнять не нужно

Код:
'mysql' => [

    'prefix' => '',
А указывать в настройках самой таблицы?
 
Сверху