Php 如何从原始对象创建雄辩的模型实例?

Php 如何从原始对象创建雄辩的模型实例?,php,laravel,eloquent,Php,Laravel,Eloquent,我需要使用Laravel进行原始数据库查询: $results = DB::select("SELECT * FROM members INNER JOIN (several other tables) WHERE (horribly complicated thing) LIMIT 1"); 我得到一个普通的PHP StdClass对象,其中包含members表中属性的字段。我想将其转换为一个成员(雄辩的模型实例),如下所示: use Illuminate\Da

我需要使用Laravel进行原始数据库查询:

$results = DB::select("SELECT * FROM members 
    INNER JOIN (several other tables) 
    WHERE (horribly complicated thing) 
    LIMIT 1");
我得到一个普通的PHP StdClass对象,其中包含members表中属性的字段。我想将其转换为一个成员(雄辩的模型实例),如下所示:

use Illuminate\Database\Eloquent\Model;

class Member extends Model {
}

我不知道该怎么做,因为成员上没有设置任何字段,我担心无法正确初始化它。实现这一点的最佳方法是什么?

您只需初始化一个新模型:

$member = new App\Member;
然后可以指定列:

$member->column = '';
或者,如果所有列都是可分配质量的:

$member->fill((array)$results);
还是我误解了什么?

你应该明确地使用它来执行

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

比如:


这将返回一个雄辩的实例,您可以根据需要执行任何操作。

您可以尝试将结果水合到模型对象:

$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...");
编辑

Laravel 5.4的Hyderaw不再提供。我们可以改用fromQuery:


你有没有试着只做一个成员模型,然后从那里获取数据?我不知道你的意思。如果你的意思是将where子句和内部联接转换为ORM代码,不,我不想这样做。你到底想从数据库中检索什么?这很好,但你会得到一组模型。
限制1
在这里没有意义。当我这样做时,我无法再选择关系。。。怎么会呢?我不明白为什么会投反对票。这和上面的答案几乎一样,但我的答案是基于雄辩的,这是同一个问题的两个可能答案,它没有回答这个问题。OP需要使用返回原始数据的复杂SQL查询。问题是如何从原始数据中创建一个新的模型实例。我完全不赞成那些不是答案的答案,而是关于另一种(希望更好)方法的建议。通常,在这种情况下,这些答案没有抓住重点,更好的方法不是可行的方法,或者没有回答OP问题。那为什么要麻烦呢?只是为了炫耀?坚持重点,如果你不知道答案,不要回答。这是不符合要求的。我们需要将数组转换为特定的模型完全脱离主题回答,
fill()
用于更新给定的可填充列。
$models = Member::hydrateRaw( "SELECT * FROM members...");
$models = Member::fromQuery( "SELECT * FROM members...");