首页 文章

Laravel 5.6嵌套雄辩的关系

提问于
浏览
0

早上好,我正在学习与游戏相关项目的模型关系,我有一个与交易模型有很多关系的银行模型

Schema::create('banks', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name',30);
        $table->string('faction',10);
        $table->string('region',3);
        $table->integer('balance')->unsigned()->nullable();
        $table->timestamps();
        $table->softDeletes();
    });

型号是:

class Bank extends Model
{
   use SoftDeletes;

   /**
   * Establishes a oneToMany relationship with the Transaction
   * model
   *
   * @param
   * @return
   */
   public function transactions()
   {
       return $this->hasMany('App\Transaction');
   }
}

交易模式是:

Schema::create('transactions', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('bank_id')->unsigned();
        $table->integer('user_id')->unsigned();
        $table->integer('operator_id')->unsigned();
        $table->string('operation', 128);
        $table->integer('amount');
        $table->string('note',255)->nullable();
        $table->timestamps();
        $table->softDeletes();

        $table->foreign('bank_id')
              ->references('id')
              ->on('banks')
              ->onUpdate('cascade');

        $table->foreign('user_id')
              ->references('id')
              ->on('users')
              ->onUpdate('cascade');

        $table->foreign('operator_id')
              ->references('id')
              ->on('users')
              ->onUpdate('cascade');

    });

用户架构是:

Schema::create('users', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->string('email')->unique();
        $table->string('password');
        $table->rememberToken();
        $table->timestamps();
    });

交易模型是:

class Transaction extends Model
{
use SoftDeletes;

public function banks()
{
    return $this->belongsTo('App\Bank');
}

public function users()
{
    return $this->belongsTo('App\User');
}
}

我想在Laravel中实现以下SQL:

SELECT t.amount, t.created_at, b.name, b.region, b.faction, u.name 
FROM transactions as t
JOIN users as u
JOIN banks as b ON t.bank_id = b.id
WHERE b.id =1
ORDER by t.created_at DESC

我设法写了这个,它返回所选银行的所有交易,在这种情况下为1(但它最终通过参数传递)

public function show($bank)
{
    $transactions = Bank::find($bank)->transactions()
                                     ->orderBy('created_at','DESC')
                                     ->get();
    dd($transactions);
}

但我不知道如何检索我的其余SQL . 任何帮助都会得到一些解释 .

上传此DD的Json的屏幕截图:Json

如何在属性中检索这两个user_id和operator_id的字段user.name?与Eloquent,而不是qBuilder

4 回答

  • 0

    我用这个修复了代码:

    $transactions = Transaction::with(['user', 'bank'])
                                    ->where('bank_id',1)
                                    ->limit(10)
                                    ->get();
        //dd($transactions);
    

    我还将Model Transaction关系修改为:

    class Transaction extends Model
    {
        use SoftDeletes;
    
        public function bank()
           {
              return $this->belongsTo('App\Bank');
           }
    
        public function user()
           {
             return $this->belongsTo('App\User');
           }
    }
    

    因为他们只返回一个模型 .

  • 0

    你可以做一些事情:

    $transactions = \App\Transaction::with('bank', 'user')
        ->where('bank_id', $bank)
        ->orderBy('created_at', 'desc')
        ->get();
    

    with() 方法将关系加载到模型上 . 然后,您可以将关系视为属性以从中访问信息,例如

    foreach ($transactions as $transaction) {
    
        $transaction->amount;
    
        $transaction->user->name;
    
        $transaction->bank->name;
        $transaction->bank->region;
    
    }
    

    欲了解更多信息,请查看documentation .

  • 0

    我建议你使用BelongsToMany关系:

    class Bank extends Model {
        public function users() {
            return $this->belongsToMany(User::class, 'transactions')
                ->withPivot('amount')
                ->orderByDesc('transactions.created_at');
        }
    }
    
    foreach($bank->users as $user) {
        // $user->name
        // $user->pivot->amount
    }
    
  • 0

    把那个方法放在Transaction模型里面,它应该是可行的

    public function getByBankId($id)
        {
            return $this
                ->join("banks as b", "b.id", "=", "transactions.bank_id")
                ->join("users as u", "u.id", "=", "transactions.user_id")
                ->where("b.id", $id)
                ->orderBy("transactions.created_at", "DESC")
                ->selectRaw("transactions.amount, t.created_at, b.name, b.region, b.faction, u.name")
                ->get();
        }
    

相关问题