web-dev-qa-db-ja.com

Laravel 5.4雄弁な関係を通じて明確な記録を取得する必要がある

「トランザクション」というテーブルがあります。そのテーブルには、id、user_id、customer_name、restaurant_name、タイムスタンプの複数の列があります。テーブルに2つまたは3つの同じレコードがある場合、restaurant_nameが同じuser_idで繰り返されていることを意味します。一意のレコードのみを取得する必要があります。ユーザーが同じレストランに3回注文した場合、それらから1つだけ取得する必要があります。

例:ピザハットから3回注文し、地下鉄から5回注文した場合。結果には、ピザハット1つと地下鉄1つが含まれているはずです。

注: 1人のユーザーが多くのトランザクションを持っている可能性があります

トランザクションモデル:

<?php

namespace App;
use App\restaurant;
use App\User;

use Illuminate\Database\Eloquent\Model;

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

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

    protected $fillable = [
        'user_id','customer_name', 'restaurant_name' , 'ordered_items' , 
    ];
}

ユーザーモデル:

<?php

namespace App;
use App\restaurant;
use App\User;

use Illuminate\Database\Eloquent\Model;

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

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

    protected $fillable = [
        'user_id','customer_name', 'restaurant_name' , 'ordered_items' , 
    ];
}

私はこのような望ましい結果を得ようとしていますが、エラーが表示されています:

BadMethodCallException in Macroable.php line 74:
Method distinct does not exist.

$user->transactions->distinct("restaurant_name");
5
user8499429

distinctはLaravelコレクションの既存の関数ではありませんが、 unique は存在します。

$user->transactions->unique("restaurant_name");

ただし、これによりすべてのトランザクションがクエリされ、コードでフィルタリングされます。クエリを使用して個別の行を取得するには、次のようにします。

$user->transactions()->groupBy('restaurant_name')->get();
10
Jerodev