Điều này nghe có vẻ hiển nhiên, nhưng Eloquent sẽ không trả lại kết quả được đặt ở đây, nhưng thay vào đó nó sẽ trả về bộ sưu tập.
Nếu bạn thâm nhập vào nguồn (Builder::get
gọi Builder::getFresh
, trong đó kêu gọi Builder::runSelect
, trong đó kêu gọi Connection::select
), bạn sẽ thấy rằng đó là ý định là chỉ đơn giản là trả lại kết quả, mà sau đó được đặt vào một bộ sưu tập (trong đó có các SortBy phương pháp).
/**
* Run a select statement against the database.
*
* @param string $query
* @param array $bindings
* @param bool $useReadPdo
* @return array
*/
public function select($query, $bindings = array(), $useReadPdo = true)
{
return $this->run($query, $bindings, function($me, $query, $bindings) use ($useReadPdo)
{
if ($me->pretending()) return array();
// For select statements, we'll simply execute the query and return an array
// of the database result set. Each element in the array will be a single
// row from the database table, and will either be an array or objects.
$statement = $this->getPdoForSelect($useReadPdo)->prepare($query);
$statement->execute($me->prepareBindings($bindings));
//** this is a very basic form of fetching, it is limited to the PDO consts.
return $statement->fetchAll($me->getFetchMode());
});
}
Nếu bạn muốn có pagination mà không cần nạp mỗi mục, sau đó bạn cần phải sử dụng @ giải pháp Marcin của (nhân đôi dưới đây):
$posts = Post::leftJoin('comments','posts.id','=','comments.post_id')->
selectRaw('posts.*, count(comments.post_id) AS `count`')->
groupBy('posts.id')->
orderBy('count','DESC')->
skip(0)->take(20)->get();
Thansk, vì vậy chỉ cần phải rõ ràng, giải pháp này sẽ không lấy tất cả các bản ghi từ cơ sở dữ liệu và sau đó sắp xếp nó ra, nó chỉ lấy 20 bản ghi ngay từ đầu phải không? – dulan
@dulan, vâng, nếu chúng ta đang nói về mã thứ 2. Trong mã đầu tiên tất cả các hồ sơ sẽ được lấy từ cơ sở dữ liệu và chỉ hiển thị một số trong số chúng, do đó bạn cần chọn giải pháp thứ hai –
cảm ơn vì đã sử dụng skip() –