Laravel | Получить значение столбца с

У меня проблема с laravel, все подробности приведены ниже.

У меня есть 2 таблицы в базе данных mysql: книги и ручки.

в книгах и ручках есть столбцы: bookid, bookname и penid, псевдоним соответственно.

У пользователей есть таблица транзакций с: bookid или penid.

Я получаю все транзакции конкретного пользователя следующим образом:

$usertransactions = $user->usertransactions;

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

ответ функции выше:

"data": {

    "Id": "1",
    "Bookid": "27",

}

или же

"data": {

    "Id": "2",
    "Penid": "42",

}

Я хочу, чтобы результат был таким, как показано ниже:

"data": {

    "Id": "1",
    "Bookid": "27",
    "Bookname" : "bookname from books table using the Bookid from response"

}

Буду признателен за помощь.

С Уважением

есть ли у вас связь между моделями usertransaction и book?

Maraboc 31.07.2018 15:59

да, все отношения моделей уже настроены, все работает нормально, я не могу найти способ получить имя книги, используя bookid из ответа из таблицы книг

Amir Parvez 31.07.2018 16:00
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
2
400
3

Ответы 3

Вы работаете с отношением "многие ко многим".

Посмотрите это: https://laravel.com/docs/5.6/eloquent-relationships#many-to-many

Итак, в вашем коде это может быть:

return $ this-> ownToMany ('Приложение \ Книга', 'транзакции', 'user_id', 'book_id');

При необходимости используйте select или pluck для форматирования данных.

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

Amir Parvez 31.07.2018 16:35

Не думаю, что вы поняли фреймворк MVC. Проверьте ответ Пеймана. Мы оба говорим вам использовать в вашей модели метод ownToMany. Это потому, что не все нужно помещать в файл контроллера. Некоторые методы должны входить в файл модели. Кроме того, вы должны показать свой код $ user-> usertransactions;

Jasonfish 01.08.2018 05:06

Вы можете получить то, что хотите, используя Красноречивый: ресурсы API:

Вы должны создать ресурс Usertransaction, предполагая, что между моделями Usertransaction и Book существует взаимно однозначная связь:

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class Usertransaction extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'Bookid' => $this->book->bookid,
            'Bookname' => $this->book->bookname 
        ];
    }
}

Наконец, в контроллере вы можете сделать это:

use App\Usertransaction;
use App\Http\Resources\Usertransaction as UsertransactionResource;

function YourMethod() {
    $usertransactions = $user->usertransactions;
    return UsertransactionResource::collection($usertransactions);
}

PS: для ручек можно сделать то же самое :)

в некоторых случаях поступает более 1 транзакции, будет ли это работать и с ними? И не могли бы вы рассказать мне, как созданный вами класс ресурсов определяет книгу как модель, не импортируя ее с помощью команды use вверху? , "$ this-> book-> bookid", извините, я не знаком с ресурсами.

Amir Parvez 31.07.2018 16:59

Для первого вопроса да, потому что мы предполагаем, что это коллекция Usertransaction::collection, для второго вопроса это не модель, которую нужно импортировать, потому что я просто связь, поэтому нет необходимости в импорте, но вам нужно указать свое отношение в книге моделей Usertransaction или переименуйте книгу в этом статусе $this->book->bookname с названием ваших отношений :)

Maraboc 31.07.2018 17:03

BadMethodCallException

Amir Parvez 31.07.2018 17:09

ведьмовский метод ??

Maraboc 31.07.2018 17:10

Освещение \ База данных \ Query \ Builder :: collection ()

Amir Parvez 31.07.2018 17:11

Ааа, извините за ошибку, это UsertransactionResource::collection, а не Usertransaction::collection, проверьте обновленный ответ :)

Maraboc 31.07.2018 17:15

Позвольте нам продолжить обсуждение в чате.

Maraboc 01.08.2018 10:04

Во-первых, обычная практика именования столбцов - это snake_case. поэтому лучше называть bookid как book_id. а также для ваших отношений и имен функций, хорошо сохранить его CamelCase. так что вместо usertransactions лучше писать userTransactions.

Вернемся к вашему вопросу. Поскольку в вашем ответе есть book_id, вы сможете установить связь между моделями UserTransaction и Book. в Book model:

public function userTransactions() {
    return $this->belongsToMany(UserTransaction::class); //it can be one to many or many to many base on your logic. I assume Many to many
}

тогда вы должны определить обратное отношение в UserTransaction model:

public function books(){
    return $this->belongsToMany(Book::class);
}

теперь вы можете загрузить все объекты книг, используя метод load, например $usertransactions = $user->usertransactions->load('books')

если вы хотите, чтобы ваш ответ точно совпадал, используйте https://laravel.com/docs/5.6/eloquent-resources, как упомянул @Maraboc.

Удачи!

Другие вопросы по теме