Laravel |通过

时间:2018-07-31 13:54:43

标签: laravel api laravel-5

我对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"

}

我将非常感谢您的帮助。

致谢

3 个答案:

答案 0 :(得分:1)

首先,命名列的常见做法是snake_case。因此最好将bookid命名为book_id。并且对于您的关系和函数名称,最好保留它CamelCase。因此最好写usertransactions而不是userTransactions

让我们回到您的问题。由于您的响应中包含book_id,因此您应该能够在UserTransactionBook模型之间建立关系。在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:您可以对钢笔做同样的事情:)