Join 从其他表按字段排序

Join 从其他表按字段排序,join,laravel,laravel-4,sql-order-by,eloquent,Join,Laravel,Laravel 4,Sql Order By,Eloquent,我有两张桌子user和user\u info及其型号user和UserInfo用户持有id,过期和用户信息id,而用户信息持有id和用户名 我希望获取过期大于或小于$now或空的所有用户,并希望按用户名对列表进行排序。这最后一部分是我的问题所在 我现在拥有的 $usersQ = User::where ('expire', '>', $now)->orWhereNull ('expire'); $usersCount = $usersQ->count (); $users =

我有两张桌子
user
user\u info
及其型号
user
UserInfo
<代码>用户持有
id
过期
用户信息id
,而
用户信息
持有
id
用户名

我希望获取
过期
大于或小于
$now
的所有用户,并希望按
用户名
对列表进行排序。这最后一部分是我的问题所在

我现在拥有的

$usersQ = User::where ('expire', '>', $now)->orWhereNull ('expire');
$usersCount = $usersQ->count ();
$users = $usersQ->get ();
我试过了

$usersQ = User::with ('user_info')->join ('user_info', 'user.user_info_id', 'user_info.id')->where ('expire', '>', $now)->orWhereNull ('expire')->orderBy ('username');
不幸的是,这不起作用(SQL语法错误)

注意:我确实需要
User
作为我的主要实体,而不是
UserInfo
,因为我需要查看
User
中的其他信息


基本上;
然后我就可以访问
user
中的所有内容,以及
user\u info
中的3个字段。我到底该怎么对付拉威尔呢?

啊,该死。看来我点错菜了

$usersQ = User::join ('user_info', 'user_info.id', '=', 'user.user_info_id')->orderBy ($order)->where ('expire', '>', $now)->orWhereNull ('expire');
$usersCount = $usersQ->count ();
$users = $usersQ->get ();
除了Laravel中的bug(是的,我认为这是一个bug)用一个重复的名称覆盖任何字段的值之外,这一切都很正常。如果有人知道解决方法那就太好了。。。如果您的
id
被覆盖,那么连接将非常无用

$users = User::with('user_info')->where('expire', '>', $now)
    ->orWhereNull('expire')->get();
$usercount = $users->count();


这是行不通的,因为Laravel会将原始模型中同名字段的值覆盖到已连接的模型中的字段值$user->id会给我
user\u info.id
而不是
user.id
。其他领域也一样。请在你的答案中添加一些解释。这不是真的。。。那么任何关系都不会起作用,因为它们都有主键和外键,etc@zaq178miami这是为满足where设置的条件的任何用户加载“user_info”。您将自己未正确执行的连接与雄辩的关系查询的建立方式混淆。它们是分开的。这不是一个BUG。。。查看生成的查询,您将看到发生了什么。Laravel论坛上的这个主题展示了一些处理列值覆盖的技巧。我想通过访问器(可能对某些人不起作用)可以为列实现类似的功能。令人难以置信的是,这样一个简单的任务似乎根本不可能用Laravel实现。。。要么如此,要么没有人愿意给出一个像样的(有效的)答案。
$users = User::with('user_info')->where('expire', '>', $now)
    ->orWhereNull('expire')->get();
$usercount = $users->count();