Laravel:加入雄辩模特
问题。如何使用雄辩产生这种查询:上campaigns.gamemaster_id = users.id其中campaigns.status = 1Laravel:加入雄辩模特
广告活动
SELECT campaigns.name,users.name FROM活动LEFT JOIN用户
id gamemaster_id name status
1 1 campaign1 1
2 2 campaign2 1
用户
id name
1 rick
2 bob
结果
id gamemaster_id name status gamemaster_name
1 1 campaign1 1 rick
2 2 campaign2 1 bob
运动模式
class Campaign extends Model
{
public function gamemaster()
{
return $this->belongsTo('App\User', 'gamemaster_id');
}
}
我尝试做侃侃而谈,但失败:
$result = Campaign::where('status', '=', 1)->with('gamemaster')->select('name')->orderBy('users.updated_at', 'desc')->get();
你可以做到这一点有两种方式,一是使用查询生成器,
$campaigns = DB::table('campaigns')->leftJoin('users', 'campaigns.gamemaster_id', '=', 'users.id')
->select(['campaigns.name as name', 'users.name as gamemaster_name'])
->where('campaigns.status', '=', 1)
->orderBy('users.updated_at', 'desc')
->get();
并与预先加载,就可以得到运动像下面。但是,要按关系属性进行排序,则需要另一个不易实现的图层。
$campaigns = Campaign::where('status', '=', 1)->with(['gamemaster' => function($query){
$query->select(['id', 'name']);
}]->select('id', 'gamemaster_id', 'name')->get();
但是你可以使用收集功能可以轻松地对它进行排序(然而,这将需要更多的执行时间)
$campaigns = Campaign::where('status', '=', 1)->with(['gamemaster' => function($query){
$query->select(['id', 'gamemaster_id', 'name', 'updated_at']);
}]->select('id', 'name')->get()->sortByDesc(function ($campaign) {
return $campaign->gamemaster->updated_at;
})
下面的查询应该工作:
Campaign::whereStatus(1)
->join('users', 'campaigns.gamemaster_id', '=', 'users.id')
->select('campaigns.name', 'users.name')
->orderBy('users.updated_at', 'desc')
->get()
你的意思是:运动::这里('状态,‘=’1 ) - >加入('users','campaigns.gamemaster_id','=','users.id') - > select('campaigns.name','users.name') - > get()。当我运行它时,什么都不会返回。嗯,是否有可能看到刚刚运行的SQL? – Olof84
whereStatus(1)或where('status','=',1)是相同的。你错过了你的状态。如果你只是做“Campaign :: whereStatus(1) - > get()”,你有什么? –
我看到您的查询返回2个用户名,但仅此。而查询似乎是:“从'campaign'内部连接'users'选择'campaigns'.'name','users'.'name'''campaign'' campaigns'.'gamemaster_id' ='users'.'id' where 'campaign'.'status' =?“但它没有秩序。 – Olof84
谢谢。第一个似乎工作。但是急切的加载提供了这个查询:“select'id',''''''''''''''status''''''''''也许它缺少一个联接部分? – Olof84
欢迎,不需要加入,它会选择属于状态为1的广告系列的游戏管理员。因此,有两个查询正在运行,首先选择广告系列,其次选择属于该广告系列的用户。它是否返回任何错误或显示意外的结果?我还应该注意到,要订购具有用户更新属性的广告系列,您需要另一个层,这就是为什么联接方式更容易。 – Burak
当我运行它时,它会这样说:SQLSTATE [42S22]:列未找到:1054'字段列表'中的未知列'gamemaster_id'(SQL:select'id','gamemaster_id','name','updated_at' (0)中的'sh_users'.'id')。我在我的实际项目中用sh在我的表前加上了前缀。 – Olof84