2013-08-14 1 views
1

У меня есть функция, которая отправляет групповые сообщения, но мне нужно получить доступ к списку контактов из определенной группы. Я попробовал EagerLoading и цепочку, но не могу заставить его работать. Таким образом, в функции sendCommunications(), эта линия вызывает у меня вопросы:Доступ к моделям из другого отношения «многие ко многим» в Laravel

$contacts = $message->group->contact()->select(array('email_address'));

Сообщение об ошибке я получаю из командной строки:

Call to undefined method Illuminate\\Database\\Eloquent\\Collection::contact()

И это то, что я до сих пор : ФУНКЦИИ

CONTROLLER:

public static function sendCommunications() 
{ 
    $queued_messages = QueuedMessage::with(array('message' => function($query) 
    { 
     $query->where('distribution_date_time', '<=', DB::raw('NOW()'));  
    }))->get(); 

    foreach ($queued_messages as $queued) 
    { 
     $message = $queued->message; 
     $contacts = $message->group->contact()->select(array('email_address')); 

     foreach ($contacts as $contact) 
     { 
      Message::send($message->email_title.'\n'.$message->email_body, $contact->email_address, $message->department->short_name); 
     } 
     $queued->delete(); 
    } 
} 

МОДЕЛИ:

QueuedMessage:

class QueuedMessage extends Eloquent 
{ 
    protected $primaryKey = 'queued_message_pk'; 
    protected $table  = 'queued_messages'; 
    public $timestamps  = false; 

    public function message() 
    { 
     return $this->belongsTo('Communication', 'message_fk'); 
    } 
} 

Связь:

class Communication extends Eloquent 
{ 
    protected $primaryKey = 'message_pk'; 
    protected $table  = 'messages'; 
    public $timestamps  = false;   

    public function establishment() 
    { 
     return $this->belongsTo('Establishment', 'establishment_fk'); 
    } 
    public function group() 
    { 
     return $this->belongsToMany('Group', 'messages_groups', 'message_fk', 'group_fk'); 
    } 
} 

Группа:

class Group extends Eloquent 
{ 
    protected $primaryKey = 'group_pk'; 
    protected $table  = 'groups'; 
    public $timestamps  = false; 

    public function department() 
    { 
     return $this->belongsTo('Department', 'department_fk'); 
    } 
    public function contact() 
    { 
     return $this->belongsToMany('Contact', 'contacts_groups', 'group_fk', 'contact_fk'); 
    } 
    public function message() 
    { 
     return $this->belongsToMany('Communication', 'messages_groups', 'group_fk', 'message_fk'); 
    }  
} 

Контакт:

class Contact extends Eloquent 
{ 
    protected $primaryKey = 'contact_pk'; 
    protected $table  = 'contacts'; 
    public $timestamps  = false;   

    public function department() 
    { 
     return $this->belongsTo('Department', 'department_fk'); 
    } 
    public function group() 
    { 
     return $this->belongsToMany('Group', 'contacts_groups', 'contact_fk', 'group_fk'); 
    } 
} 

ответ

0

Это было бы из-за group() возвращения коллекции, т.е. группу результатов, ни один результат.

Вы не можете вызвать метод вызова по группе элементов.

Вы могли бы вместо того, чтобы перебрать элементы, возвращенными в group и позвонить contact по каждому из них, в свою очередь, ала

$contacts = array(); 
foreach($message->group as $group){ 
    merge_array($contacts, $group->contact()->select(array('email_address'))); 
} 
0

Если вы заметили, что Красноречивый класс Communication он использует belongsToMany отношения. Когда вы вызываете $message->group, это вернет Collection групп.

Вы можете попробовать

$message->group->each(function($group) use($message){ 
    $group->contact()->get('email_address')->each(function($contact) use($message){ 
      Message::send($message->email_title.'\n'.$message->email_body, $contact->email_address, $message->department->short_name); 
    }); 
}); 

Eloquent Collection обеспечивает each функцию цикла через коллекцию, которая принимает функцию обратного вызова в качестве параметра для выполнения дополнительной работы с коллекцией. Надеюсь, что это поможет