2017-02-06 8 views
0

Как я могу создать собственную взаимосвязь hasMany с критериями?Laravel hasMany self where criteria?

, например, это то, что я хочу сделать:

class Payment extends \Illuminate\Database\Eloquent\Model { 
    public function refunds() { 
     return $this->hasMany(self::class, 'transaction_id', 'transaction_id') 
      ->where('this.method','=','that.method') 
      ->where('that.amount','<',0); 
    } 
} 

Но я не знаю, как дать таблицу два различных псевдонимы, так что я могу установить критерии WHERE.

N.B. в моем примере «возврат» - это всего лишь отрицательный платеж. Они оба будут иметь одинаковый идентификатор транзакции и метод.

ответ

0

Как насчет построения класса HasMany?

use Illuminate\Database\Eloquent\Relations\HasMany; 
use Illuminate\Database\Eloquent\Model; 

class Payment extends Model 
{ 
    public function refunds() { 
     $fKey = 'transaction_id'; 
     $instance = new static; 
     $instance = $instance->newQuery() 
         ->where('this.method','=','that.method') 
         ->where('that.amount','<',0);  

     return new HasMany(
      $instance, $this, $instance->getTable().'.'.$fKey, $fKey 
     ); 
    } 
} 
+0

Как установить псевдонимы для '' this' и that'? 'this' должна быть текущей моделью,' that' должна быть связанной моделью. – mpen

0

Вы можете установить соотношение нормальное и поставить условие на контроллер

$user = User::with('Profile')->where('status', 1)->whereHas('Profile', function($q){ 
      $q->where('gender', 'Male'); 
     })->get(); 
+0

Как вы установили псевдоним для профилей, чтобы я мог правильно выполнить условие? – mpen

+0

вы должны установить отношения в своей родительской модели, чтобы вы могли вызывать эту модель отношений. Отбросить родительскую модель. '' 'public function user() { return $ this-> принадлежитTo (User :: class); } '' ' –