我对laravel有问题,所有详细信息在下面给出。
我在mysql数据库中有2个表:书和笔。
书和笔分别具有列:bookid,bookname和penid,penname。
用户有一个带有: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"
}
我将非常感谢您的帮助。
致谢
答案 0 :(得分:1)
首先,命名列的常见做法是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')
方法来加载所有图书对象
如果您希望您的响应完全匹配,则使用@Maraboc提到的https://laravel.com/docs/5.6/eloquent-resources
。
祝你好运!
答案 1 :(得分:0)
您正在与多对多关系。
查看以下内容:https://laravel.com/docs/5.6/eloquent-relationships#many-to-many
因此在您的代码中可能是:
返回$ this-> belongsToMany('App \ Book','transactions','user_id','book_id');
如果需要,请使用select或pluck格式化数据。
答案 2 :(得分:0)
您可以使用Eloquent: API Resources获得所需的内容:
您必须创建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:您可以对钢笔做同样的事情:)