簡體   English   中英

使用 Laravel 返回一對多雄辯關系中的最后一條記錄

[英]Return the last record in a One to many Eloquent Relation using Laravel

假設存在One To Many關系,其中一個用戶有多個作業, job表中的最后一條記錄是用戶的當前作業。 有什么更好的方法可以讓用戶返回上一次工作?

這是我嘗試過的。

User Class

public function ejob(){
   return $this->hasMany(Ejob::class);
}

Ejob Class

public function user(){
   return $this->belongsTo(User::class);
}

API Controller Method

public function index()
{
  return UserResource::collection(( 
  User::with(
          $this->particulars() // I want the last record from this line
        )->orderBy('id', 'desc')->get() ));
}

Particulars Method

// I want the last record from this
private function particulars(){
        return 
        [
            'ejob.company:id,name', 
            'ejob.job:id,title', 
            'ejob.department:id,name',
            'ejob.reporting:id,surname,first_name,other_name',
            'ejob.employmentstatus:id,name', 
            'country:id,name', 
            'gender:id,name', 
            'state:id,name'
        ];
}

User Resource

public function toArray($request)
    {
        //return parent::toArray($request);
        return [
            'data' => [
                'id' => $this->id,
                'surname' => $this->surname,
                'first_name' => $this->first_name,
                'other_name' => $this->other_name,
                'email' => $this->email,
                'phone_number' => $this->phone_number,
                'birthday' => $this->birthday->format('d-m-Y'),
                'age'=> $this->birthday->age,
                'ejob' => $this->whenLoaded('ejob'),
        ];
    }

目前,這會從ejobs表中返回一個包含所有相關記錄的用戶,但我只想要最后一個作業。

您可以為相同的關系定義另一種關系方法,但將其定義為 Has One 而不是 Has Many:

public function currentJob()
{
   return $this->hasOne(Ejob::class, ...)->latest();
   // order by by how ever you need it ordered to get the latest
}

然后你可以在需要的地方急切加載它而不是ejob關系。

您可以使用first()而不是get() 所以它會得到一個單一的模型實例。 get()方法給出一個集合,而first()方法給出一個單一的模型實例。

User::with(
          $this->particulars()
        )->orderBy('id', 'desc')->first()

或者您可以使用latest()獲取最后插入的記錄。

User::with(
          $this->particulars()
        )->latest()->first()

->latest()從數據庫中獲取最新的數據集。 簡而言之,它對獲取的數據進行排序,使用created_at列按時間順序排列數據。

編輯:-

由於您想獲得關系的最后記錄,您可以按如下方式進行。

User::with('ejob', function($query) {
    return $query->latest()->first();
})->get();
// in your case

public function currentJob()
{
   return $this->hasOne(Ejob::class, ...)->latestOfMany();
   // order by by how ever you need it ordered to get the latest
}

// another example 

public function latestPerformance()
{
    return $this->hasOne(Performance::class)->latestOfMany();
}

您可以按 GROUP BY 對其進行分組,然后返回所有結果。 在那里你會看到每個用戶的工作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM