Tôi đang cố gắng để tái tạo một tham gia như vậy bằng cách sử dụng xây dựng truy vấn laravel:Laravel 4 hùng biện Query Builder - Complicated tham gia với biến
LEFT JOIN content_userdata
ON content_id = content.id
AND user_id = $user_id
Tôi đã phát hiện ra rằng tôi có thể làm thêm "Tiện ích" bằng cách sử dụng sau đây chức năng trong mô hình của tôi mở rộng Eloquent
public function scopeJoinUserData($query, $user_id)
{
return $query->leftJoin('content_userdata', function($join)
{
$join->on('content_userdata_content_id', '=', 'content.content_id')->on('content_userdata_user_id', '=', 10);
});
}
Nhưng điều này tạo ra hai vấn đề. Đầu tiên tôi không thể lấy biến $ user_id vào hàm và thứ hai ngay cả khi tôi mã hóa nó cho mục đích thử nghiệm như tôi đã làm ở trên (tới int "10") Laravel mã hóa nó trong `có nghĩa là nó được hiểu là tên cột khi nó cần Không, như vậy:
left join `content_userdata`
on `content_id` = `content`.`id`
and `user_id` = `10`
Vì vậy, bây giờ tôi có hai vấn đề.
- tôi không thể nhận được $ user_id vào tham gia chức năng khi sử dụng truy vấn phạm vi
- Thậm chí nếu tôi có thể tôi không thể gửi một biến đến tham gia vì nó luôn diễn giải nó như một tên cột
Tại sao tôi muốn làm điều này? Tôi nhận thấy một câu trả lời có thể là đặt nó ở một nơi. Tuy nhiên tôi đang cố gắng thực hiện theo cách này vì kết nối có thể không nhất thiết trả về bất kỳ kết quả nào (do đó là phần nối trái), vì bảng content_userdata chứa những thứ như xếp hạng của người dùng cho một phần nội dung. Nếu tôi sử dụng một vị trí thì kết quả không có gì trong bảng content_userdata sẽ không được trả về, như thể tôi có thể đặt nó trong tham gia thì chúng sẽ được trả về do tham gia bên trái. Có anyway để đạt được điều này trong Laravel và nếu không phải là những lựa chọn thay thế, rõ ràng là thay đổi hoàn toàn mương Laravel là trên đầu nhưng thay thế duy nhất tôi có thể nghĩ là để có được userdata trong một truy vấn riêng biệt.
Bạn nên thay đổi câu trả lời của mình theo cách mà nó không đưa ra lỗ hổng SQL injection. – vog