У меня проблема с 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"
}
Буду признателен за помощь.
С Уважением
да, все отношения моделей уже настроены, все работает нормально, я не могу найти способ получить имя книги, используя bookid из ответа из таблицы книг






Вы работаете с отношением "многие ко многим".
Посмотрите это: https://laravel.com/docs/5.6/eloquent-relationships#many-to-many
Итак, в вашем коде это может быть:
return $ this-> ownToMany ('Приложение \ Книга', 'транзакции', 'user_id', 'book_id');
При необходимости используйте select или pluck для форматирования данных.
Не думаю, что ты понял мой вопрос, приятель. В файлах модели ничего менять не надо, это в файле контроллера. Мне нужен оператор, который может получить транзакцию, а затем получить идентификатор из полученного ответа, и, используя этот идентификатор, он получает имя книги из таблицы книг.
Не думаю, что вы поняли фреймворк MVC. Проверьте ответ Пеймана. Мы оба говорим вам использовать в вашей модели метод ownToMany. Это потому, что не все нужно помещать в файл контроллера. Некоторые методы должны входить в файл модели. Кроме того, вы должны показать свой код $ user-> usertransactions;
Вы можете получить то, что хотите, используя Красноречивый: ресурсы 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", извините, я не знаком с ресурсами.
Для первого вопроса да, потому что мы предполагаем, что это коллекция Usertransaction::collection, для второго вопроса это не модель, которую нужно импортировать, потому что я просто связь, поэтому нет необходимости в импорте, но вам нужно указать свое отношение в книге моделей Usertransaction или переименуйте книгу в этом статусе $this->book->bookname с названием ваших отношений :)
BadMethodCallException
ведьмовский метод ??
Освещение \ База данных \ Query \ Builder :: collection ()
Ааа, извините за ошибку, это UsertransactionResource::collection, а не Usertransaction::collection, проверьте обновленный ответ :)
Позвольте нам продолжить обсуждение в чате.
Во-первых, обычная практика именования столбцов - это 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.
Удачи!
есть ли у вас связь между моделями
usertransactionиbook?