2015-12-30 88 views
0

我正在慢慢地將我的API移到Laravel並與Query Builder交手。添加項目到查詢結果 - Laravel

我試圖做到這一點:

$data = array(); 

$query = "SELECT * FROM blog_posts WHERE post_type = 3 AND post_status = 1 ORDER BY id DESC"; 
$result = mysqli_query($cms_connection, $query); 
if($result) { 
    while($row = mysqli_fetch_assoc($result)) { 
     $row['post_seo'] = seoUrl($row['post_title']); 
     $data['data'][] = $row; 
    } 
    $data['success'] = true; 
    $response = json_encode($data); 
} 

我的問題並不一定是得到了查詢,但你可以看到我使用的查詢結果,然後注入其放回最後的array

所以,本質上,我正在讀取行,轉換一些獲取的屬性,然後將新創建的屬性注入到結果數組中。

這是我到目前爲止有:

$posts = DB::table('blog_posts') 
    -where(['post_type' => 1, 'post_status' => 1) 
    ->orderBy('id', 'desc') 
    ->take(5)->get(); 

回答

4

你可以這樣來做

//獲取數據(你的代碼的一部分)

$posts = DB::table('blog_posts') 
-where(['post_type' => 1, 'post_status' => 1]) 
->orderBy('id', 'desc') 
->take(5)->get(); 

//添加post_seo

foreach ($posts as $post) { 
    $post->post_seo = seoUrl($post->post_title); 
} 

//設置結果數組

$data['data'] = $posts; 
$data['success'] = true; 

//響應

$response = response()->json($data); 

//或者如果你想回到它只是

return response()->json($data); 

編輯

你可以使用Eloquent做得更好一點。如果你有這樣的模型(需要有效的命名空間和use語句添加)

class BlogModel extends Model 
{ 
    protected $table = 'blog_posts'; 
    protected $appends = ['post_seo']; 

    public function getPostSeoAttribute($value) 
    { 
     return seoUrl($this->post_title); 
    } 
} 

(添加訪問到post_seo屬性,並添加post_seo到結果轉換成數組時)

你現在可以做的(更短的語法比前面的例子):

//讓您的數據

$posts = BlogPost::where('post_type',1) 
->where('post_status',1) 
->orderBy('id', 'desc') 
->take(5)->get(); 

//響應

$response = response()->json(['data' => $posts, 'success' => true]); 
+0

哦,哇,我已經和Laravel一起工作了幾年,我完全錯過了'$ appends'的存在。謝謝!這將非常有用。 –

+0

@JoelHinz很高興我可以學習你的東西:)我也在學習所有的時間,並發現新的Laravel功能:) –

+0

再加一個編輯部分! – llioor