Php Id列被联接覆盖

Php Id列被联接覆盖,php,mysql,laravel,laravel-4,eloquent,Php,Mysql,Laravel,Laravel 4,Eloquent,使用Laravel4.2和MySQL 我有一个applications表,其中包含id和fit\u score\u id列,还有一个fit\u scores表,其中包含id列。这是一种基本的“属于”关系 以下代码: $query = Application::join('fit_scores', 'applications.fit_score_id', '=', 'fit_scores.id'); $collection = $query->get(); …生成一组应用程序模型,其id属

使用Laravel4.2和MySQL

我有一个
applications
表,其中包含
id
fit\u score\u id
列,还有一个
fit\u scores
表,其中包含
id
列。这是一种基本的“属于”关系

以下代码:

$query = Application::join('fit_scores', 'applications.fit_score_id', '=', 'fit_scores.id');
$collection = $query->get();
…生成一组
应用程序
模型,其
id
属性设置为
fit\u score\u id
的值。我是怎么做的


我应该注意,有必要进行这种连接,而不是简单地使用雄辩的关系,因为我想在
fit_scores
表中按列对结果进行排序。我不相信在没有明确连接的情况下使用Eloquent是可能的。

我能够使用以下答案找到可能的解决方案:

基本上,由于Laravel不会自动在列名前面加上
table\u name.
作为联接表的前缀,因此我们需要通过在联接中为任何冲突的列名添加别名来手动解决此问题。将此select语句添加到“我的查询”完成了以下操作:

->select(DB::raw("applications.*, fit_scores.*, applications.id as id"))

这取决于您需要什么,但可能您可以使用渴望加载来实现它。如果您需要混合连接和快速加载,请检查此项

解决此问题的最佳方法是将join方法链接到select方法,如下所示:

Application::select('*', \DB::raw("applications.id as appid"))
             ->join('fit_scores', 'applications.fit_score_id', '=', 'fit_scores.id')
             ->get();

解释:解决方案只是建议我们不要考虑用连接的id覆盖第一个id的行为,我们可以连接到主选择查询(在连接之前)并将id列的标签更改为其他内容(在本例中为“appid”)。通过这样做,我们最终将父表的id标记为'appid',而连接表的id再次标记为'id',而他们在最终结果上生活在一起。

我希望有人会给出更好的解决方案,但我认为这是我们目前从Elount获得的最好的解决方案,因此,在经过最短时间后,我可能会接受它。在本例中,目标是返回按联接表上的列排序的结果。单独的即时加载对此不起作用,因为它仍然在一个单独的附加查询中从相关表中获取记录。这意味着在选择之后,需要用PHP对模型进行排序。如果我误解了什么,请告诉我。我错过了联接表中的order子句。很抱歉是否尝试在联接表id列上使用别名?我想通过消除这个“id”字段的歧义来解决您的问题。是的,这就是我在接受的解决方案中所做的(
applications.id as id
)。我不需要为联接表上的id列添加别名,因为我不需要该列的值。太好了!我遇到了一些关于联接表和不明确字段的问题。别名通常可以解决这个问题。很高兴听到!