Laravel 使用 get() 加入返回的查询

Laravel join on returned query with get()

我正在处理一个 Laravel 5 项目,在该项目中我使用特征来创建易于阅读和使用的可重用逻辑和通用函数。

其中一个函数,getDevices 只是 returns 我所有设备的集合,但是,我的函数 getCalls 需要 运行 连接返回的收集我的 getDevices 并且没有复制我的 getDevices 函数或将模型移动到 getCall 我不确定我遗漏了什么以及如何实现这样的结果。

我在视图中收到一条错误消息,指出连接方法不存在。

Method Illuminate\Database\Eloquent\Collection::join does not exist.

<?php
​
namespace App\Traits;
​
use App\Models\Device;
use App\Models\DeviceGroupsCalls;
use Carbon\Carbon;
use DB;
​
trait Calls {
​
  /*
  * Get all devices
  */
  protected function getDevices()
  {
    return Device::get();
  }
​
​
  /*
  * Get all enabled devices
  */
  protected function getEnabledDevices()
  {
    return Device::where('enabled', true)->get();
  }
​
​
  /*
  * Get all disabled devices
  */
  protected function getDisabledDevices()
  {
    return Device::where('enabled', false)->get();
  }
​
​
  /*
  * get all calls by devices
  */
  protected function getCalls()
  {
    $query = $this->getDevices();
    $devices = $query->join('devicegroupscalls', 'devicegroupscalls.device_groups_id', '=', 'devices.device_groups_id')
                     ->where('devices.enabled', true)
                     ->where('devicegroupscalls.enabled', true)
                     ->first();
​
    return $devices;
  }
​
}

您已经得到结果,那么您正在加入不正确的记录。请查看更新后的文件。

<?php
​
namespace App\Traits;
​
use App\Models\Device;
use App\Models\DeviceGroupsCalls;
use Carbon\Carbon;
use DB;
​
trait Calls {
​
  /*
  * Get all devices
  */
  protected function getDevices()
  {
    return new Device;
  }
​
​
  /*
  * Get all enabled devices
  */
  protected function getEnabledDevices()
  {
    return Device::where('enabled', true);
  }
​
​
  /*
  * Get all disabled devices
  */
  protected function getDisabledDevices()
  {
    return Device::where('enabled', false);
  }
​
​
  /*
  * get all calls by devices
  */
  protected function getCalls()
  {
    $query = $this->getDevices();
    $devices = $query->join('devicegroupscalls', 'devicegroupscalls.device_groups_id', '=', 'devices.device_groups_id')
                     ->where('devices.enabled', true)
                     ->where('devicegroupscalls.enabled', true)
                     ->first();
​
    return $devices;
  }
​
}

如错误所述 (Method Illuminate\Database\Eloquent\Collection::join does not exist.) 您尝试对集合使用 Laravel 查询方法。 在执行 get()first() 等方法(这些方法对数据库执行查询)之前,您必须使用此方法 (join)。 在方法 getDevices() 中使用 get() 尝试使用 query()。这将创建查询生成器实例,而不是从数据库(和 returns Laravel 集合)

获取数据