Php 如何从原始对象创建雄辩的模型实例?
我需要使用Laravel进行原始数据库查询: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
$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...");