Laravel возвращает значение определенного столбца в отношении - PullRequest
0 голосов
/ 13 декабря 2018

Я чрезвычайно новичок в Laravel.Вы можете помочь мне с небольшой проблемой: я не могу вернуть в коллекцию только значение определенного столбца в отношении, определенном в модели.Я объясню:

У меня есть 2 таблицы:

1 - Tomos

2 - Документы

Миграции:

1- Томос

    private $table = 'tomos';

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create($this->table, function (Blueprint $table) {
            $table->increments('id');
            $table->string('name')->nullable(false);
            $table->text('description')->nullable(true);
            $table->boolean('active')->default(true);
            $table->timestamps();
        });
    }

2- Документы

private $table = 'documents';

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create($this->table, function (Blueprint $table) {
            $table->increments('id');
            $table->date('date')->nullable(false);
            $table->integer('provider_id');
            $table->integer('tomo_id');
            $table->string('folio')->nullable(false);
            $table->integer('user_id');
            $table->text('description');
            $table->timestamps();

            $table->foreign('provider_id')
                ->references('id')->on('providers');

            $table->foreign('tomo_id')
                ->references('id')->on('tomos');

            $table->foreign('user_id')
                ->references('id')->on('users');
        });
    }

Отношения

1- Томо

public function document()
{
    return $this->hasMany(Document::class);
}

2- Документ

public function tomo()
{
    return $this->belongsTo(Tomo::class);
}

Контроллер

class Documents extends Controller
{
    public function read(Request $request)
    {
        $provider = $request->only('id');

        $documents = Document::select(['id', 'date', 'tomo_id', 'description'])
            ->with([
                'tomo' => function ($query) {
                    $query->select('id', 'name');
                }
            ])->orderBy('date', 'ASC')
            ->paginate(25);

        return $documents;
    }
}

Я получаю следующий ответ в формате JSON:

current_page    1
    data    […]
        0   {…}
            id  2
            date    2018-12-01
            tomo_id 1
            description 1
            tomo    {…}
                id  1
                name    Tomo 1

Но... Я не хочу, чтобы ключ ('tomo') возвращал объект, я хочу, чтобы он возвращал значение столбца ('name') в виде строки.Пример:

current_page    1
    data    […]
        0   {…}
            id  2
            date    2018-12-01
            tomo_id 1
            description 1
            tomo Tomo 1

Заранее большое спасибо ..

Ответы [ 3 ]

0 голосов
/ 13 декабря 2018

Сначала вам нужно добавить protected $appends = array('tomo_name'); в качестве атрибута, потому что это тот, который не существует в таблице модели.

 public function getTomoNameAttribute()
{
    return $this->tomo()->name;  
}

После этого вы можете получить доступ к имени томо, как это ->tomo_name

Я не уверен на 100%, что этот код будет работать только с копией вставки, но вы можете получить идею и поработать над ней немного больше.

Да, и имейте в виду, чтозагружая атрибут, каждый раз будет запрашивать базу данных для этого "томо".

0 голосов
/ 13 декабря 2018

Большое спасибо: Петр и Мунтяну Петрисор

Специально для: Мунтяну Петрисор

IЯ мог решить мою проблему с помощью предложенного вами решения, ранее я достиг его с помощью 'join' :

class Documents extends Controller
{
    public function read(Request $request)
    {
        $provider = $request->only('id');

        $documents = Document::join('tomos', 'documents.tomo_id', '=', 'tomos.id')
            ->join('users', 'documents.user_id', '=', 'users.id')
            ->where(['provider_id' => $provider])
            ->paginate(25, array(
                'documents.id',
                'documents.date',
                'documents.folio',
                'documents.description',
                'tomos.name as tomo',
            ));

        return $documents;
    }
}

А теперь с вашей помощью - атрибуты творит чудеса:

Модель документа

protected $appends = [
    'tomo_name',
    'user_fullname'
];

public function getTomoNameAttribute()
{
    return $this->tomo()->first()->name;
}

public function getUserFullNameAttribute()
{
    return $this->user()->first()->first_name . ' ' . $this->user()->first()->last_name;
}

Контроллер документов

class Documents extends Controller
{
    public function read(Request $request)
    {
        $provider = $request->only('id');

        $documents = Document::select(['id', 'date', 'tomo_id', 'user_id', 'folio', 'description'])
            ->where(['provider_id' => $provider])
            ->orderBy('date', 'ASC')
            ->paginate(25);

        return $documents;
    }
}

А теперьон возвращает данные так, как я ожидал

data    […]
    0   {…}
        id  2
        date    2018-12-01
        tomo_id 1
        user_id 1
        folio   1
        description 1
        tomo_name   1
        user_fullname   First Last

Большое вам спасибо!

0 голосов
/ 13 декабря 2018

В вашем контроллере попробуйте:

$documents->getCollection()->transform(function ($item) {
    $item->tomo = $item->tomo->name;
    return $item;
});
return $documents;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...