2016-11-28 178 views
2

我需要使用Laravel原始数据库查询:如何从原始对象创建一个Eloquent模型实例?

$results = DB::select("SELECT * FROM members 
    INNER JOIN (several other tables) 
    WHERE (horribly complicated thing) 
    LIMIT 1"); 

我得到一个简单的PHP stdClass对象解决与有关成员表中的属性的字段。我想将其转换成一个会员(雄辩的模型实例),它是这样的:

use Illuminate\Database\Eloquent\Model; 

class Member extends Model { 
} 

我不知道如何做到这一点,因为成员国不具有在其上设置的任何字段,我担心我不会正确初始化它。什么是实现这一目标的最佳方式?

+0

你尝试只做一个会员模式,并从那里获取数据? – GabMic

+1

我不确定你的意思。如果你的意思是把where子句和内部连接转换成ORM代码,不,我不想这样做。 –

+0

你想从数据库中检索到什么? – GabMic

回答

2

您可以尝试滋润你的结果,模型对象:

$results = DB::select("SELECT * FROM members 
         INNER JOIN (several other tables) 
         WHERE (horribly complicated thing) 
         LIMIT 1"); 

$models = Member::hydrate($results->toArray()); 

或者你甚至可以让Laravel自动水合物他们为你从原始查询:

$models = Member::hydrateRaw("SELECT * FROM members..."); 
+1

这很好,但你会得到一个模型的集合。 '极限1'在这里没有意义。 – sleepless

+1

当我这样做时,我不能再选择关系了......怎么回事? –

-1

你可以简单地初始化一个新的模式:

$member = new App\Member; 

然后,你可以指定列:

$member->column = ''; 

或者如果所有列质量分配:

$member->fill((array)$results); 

;或者我误解了一些东西?

-3

您应该定义使用Eloquent来执行该操作。

您可能会声明模型之间的关系,并使用where条件。

,如:

Member::where(......)->get(); 

这将返回一个雄辩的例子,你可以做任何你需要的。

+0

我不明白为什么它有downvote。这与上面的答案几乎是一样的,但我的口头是基于雄辩的,对于同一个问题,这是两个可能的答案。 –

+1

它不回答问题。 OP需要使用返回** raw **数据的复杂SQL查询。问题是关于从原始数据创建一个新的模型实例。 –

+0

我完全downvote答案不是答案,但建议另一种(希望更好)的方式做一件事。通常,就像在这种情况下,这些答案没有得到重点,更好的方式不是一种可行的方式,或者不回答OP问题。那为什么要麻烦?只是为了炫耀?坚持这一点,如果你不知道答案,不要回答。 – zontar

相关问题