2015-12-11 2 views
1

У меня есть проблема с красноречивым и L4.2Eloquent Пользовательские Pivot проблема с belongsTo

Я пытаюсь установить заказную модель Pivot ниже:

//campaign model 

public function users(){ 
    return $this->belongsToMany('User'); 
} 


public function newPivot(Eloquent $parent, array $attributes, $table, $exists){ 
    if ($parent instanceof User) { 
     return new CampaignUser($parent, $attributes, $table, $exists); 
    } 

    return parent::newPivot($parent, $attributes, $table, $exists); 
} 

//user model 

public function campaigns(){ 
    return $this->belongsToMany('Campaign'); 
} 


public function newPivot(Eloquent $parent, array $attributes, $table, $exists){ 
    if ($parent instanceof Campaign) { 
     return new CampaignUser($parent, $attributes, $table, $exists); 
    } 

    return parent::newPivot($parent, $attributes, $table, $exists); 
} 

и ниже моей пользовательской модели поворота «CampaignUser "

public function campaign() { 
    return $this->belongsTo('Campaign'); 
} 

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

public function facture() { 
    return $this->belongsTo('Facture'); 
} 

модели Фактура имеет что-то вроде hasMany ('CampaignUser') в метод, называемый campaign_user.

Я пытаюсь сделать что-то вроде:

> $facture->campagne_user 

, но я получил эту ошибку:

Аргумент 1 передается Осветите \ Database \ Eloquent \ Отношения \ Pivot :: __ конструкта() должен быть экземпляром Illuminate \ Database \ Eloquent \ Model, не указанным, вызывается в laravel/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php в строке 849 и определен

У кого-то была эта проблема раньше? Как я могу это решить?

Заранее спасибо.

+0

Вы можете вставить полное пользовательское определение CampaignUser? – lagbox

+0

Это уже на моем предыдущем посту –

+0

UserCampaign - это не стандартная модель, поэтому вы не можете использовать ее в качестве отношения. Он требует аргументов конструктора, которых нет в обычной модели. – lagbox

ответ

0

У меня такая же ошибка, пытаясь добиться чего-то подобного. Действительно, вы не можете использовать стержень как другое отношение, хотя оно наследуется от Model, но мы можем использовать traits для обмена кодом между realModel и обычным Pivot.

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

trait CampaignUserTrait { 

    public function campaign() { 
     return $this->belongsTo('Campaign'); 
    } 

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

    public function facture() { 
     return $this->belongsTo('Facture'); 
    } 
} 

Затем определим CampaignUser, который наследуется от модели, и применять черты:

class CampaignUser extends Model { 
    use CampaignUserTrait 
} 

Следующая , вы делаете то же самое с пользовательским классом поворота:

class CampaignUserPivot extends Pivot { 
    use CampaignUserTrait 
} 

Наконец в вашем Facture классе, просто создать отношения с CampaignUser, которая простирается Model:

class Facture extends Model { 

    public function campaign_user() { 
     return $this->hasMany('CampaignUser'); 
    } 
} 

Метод newPivot Теперь ссылается на новый класс:

public function newPivot(Model $parent, array $attributes, $table, $exists){ 
    if ($parent instanceof Campaign) { 
     return new CampaignUserPivot($parent, $attributes, $table, $exists); 
    } 

    return parent::newPivot($parent, $attributes, $table, $exists); 
} 

В принципе любой код, стержень и модель доля должна быть в trait.

Я довольно новичок в Laravel и PHP в целом, поэтому я не виню никого, кто думал, что это плохая идея, или если может быть более элегантное решение. Более того, я не нашел недостатка, но, вероятно, есть.

Привет,

Смежные вопросы