【问题标题】:Accessing models from another many-to-many relationship in Laravel从 Laravel 中的另一个多对多关系访问模型
【发布时间】:2013-08-14 05:06:45
【问题描述】:

我有一个发送群组电子邮件的功能,但我需要访问特定群组的联系人列表。我已经尝试过 EagerLoading 和链接,但似乎无法让它工作。所以在sendCommunications() 函数中,这一行给我带来了问题:

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

我从命令行收到的错误信息是:

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

这就是我目前所拥有的:

控制器功能:

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');
    }
}

【问题讨论】:

    标签: php laravel laravel-4 eloquent


    【解决方案1】:

    这是由于 group() 返回一个集合,即一组结果,而不是单个结果。

    您不能对一组项目进行方法调用。

    您将能够改为循环遍历 group 中返回的项目,并依次调用您的 contact 每个项目,ala

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

    【讨论】:

      【解决方案2】:

      如果你注意到你的 Eloquent 类 Communication 它使用 belongsToMany 关系。当您调用 $message-&gt;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 集合提供了一个each 函数来循环遍历集合,该函数将回调作为参数来对集合执行附加操作。 希望这会有所帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-01
        • 1970-01-01
        • 2021-09-05
        • 2020-07-08
        • 2016-02-21
        • 1970-01-01
        • 2017-09-22
        相关资源
        最近更新 更多