Вам необходимо добавить некоторые отношения в каждую модель, чтобы присоединиться к ним
orders
namespace App\Model;
use Illuminate\Database\Eloquent\Model;
class orders extends Model
{
protected $table = 't_orders';
protected $primaryKey = 'id';
// join t_orders with t_order_order_status but get only the latest matching row out of order_order_status
public function status_log()
{
return $this->hasMany('App\Model\order_order_status', 'order_id','id')->orderBy('t_order_order_status.id', 'desc')->limit(1);
}
}
order_order_status
namespace App\Model;
use Illuminate\Database\Eloquent\Model;
class order_order_status extends Model
{
protected $table = 't_order_order_status';
protected $primaryKey = 'id';
// join t_orders with t_order_order_status
public function status_name()
{
return $this->hasOne('App\Model\order_statuses', 'id','order_status_id');
}
}
order_statuses
namespace App\Model;
use Illuminate\Database\Eloquent\Model;
class order_statuses extends Model
{
protected $table = 't_order_statuses';
protected $primaryKey = 'id';
}
Тогда вы бы сделали что-то вроде этого
App\Model\orders::with('status_log.status_name')->get();
Должно получиться что-то вроде этого
[
{
"id":2,
"user_id":73,
"order_number":"37-5",
"job_reference":"Janis Joplin",
"accounting_reference":null,
"created_at":"2018-06-25 02:27:21",
"updated_at":"2018-06-25 02:27:21",
"status_log":[{
"id":4,
"order_id":2,
"order_status_id":4,
"user_id":753,
"created_at":"2012-06-27 09:56:00",
"updated_at":"2012-06-27 09:56:00",
"status_name":{
"id":4,
"title":"Confirmed",
"tag":"confirmed",
"created_at":"2018-06-25 02:25:28",
"updated_at":"2018-06-25 02:25:28"
}
}]
}
]
Примечание. Для удобства чтения я добавил в таблицу имена таблиц с t_
, но вы можете назватьони такие же, как ваши модели.
ОБНОВЛЕНИЕ
Для этого вы можете использовать что-то вроде этого, передавая кластер, который будет фильтровать на основе идентификатора статуса
$status = 3;
$result = App\Model\orders::with(['status_log'=>function($query) use($status) {
$query->where('t_order_order_status.order_status_id','=', $status);
$query->with('status_name');
}])->get();
return $result;
Даст
[{
"id":2,
"user_id":73,
"order_number":"37-5",
"job_reference":"Janis Joplin",
"accounting_reference":null,
"created_at":"2018-06-25 02:27:21",
"updated_at":"2018-06-25 02:27:21",
"status_log":[{ // will be empty [] for order not in t_order_order_status
"id":3,
"order_id":2,
"order_status_id":3,
"user_id":753,
"created_at":"2012-06-27 09:56:00",
"updated_at":"2012-06-27 09:56:00",
"status_name":{
"id":3,
"title":"Order",
"tag":"order",
"created_at":"2018-06-25 02:25:28",
"updated_at":"2018-06-25 02:25:28"
}
}]
}]
. Он вернет все заказы, но вы можете использовать status_log
, чтобы выяснить, есть ли у него какие-либо записи в таблице t_order_order_status
, но в случае, если вы хотите удалить «лишние»"и сохраните только те ордера, которые есть в таблице логгеров, тогда вы можете использовать фильтр на $result
.
return $result->filter(function ($item) {
return !empty($item->status_log && count($item->status_log));
});