我正在尝试实现 sql 查询
select * from user,comments where comments.user_id= user.id
所以我在我的用户模型上使用以下代码
创建一个getcomments
方法
public function comments(){return $this->hasMany('Comments')}
现在正在通过
访问数据$data = User::find(1)->comments;
但它只给了我评论表中的数据(不是用户和评论) 我怎么能这样做
答案 0 :(得分:3)
Eloquent ORM遵循Active Record模式。当您编写纯sql语句时,考虑建模和与数据交互是一种稍微不同的方式。
设置评论关系是一个很好的步骤。现在,您需要考虑如何与数据进行交互。
您可以使用以下声明获取所有信息:
$user = User::with('comments')->find(1);
使用此语句,所有用户信息都将加载到$user
对象中,并且所有注释信息都将加载到$user->comments
Collection属性中。可以这样访问此信息:
// get the info
$user = User::with('comments')->find(1);
// display some user info
echo $user->first_name;
echo $user->last_name;
// loop through the comment Collection
foreach($user->comments as $comment) {
// display some comment info
echo $comment->text;
}
with('comments')
部分告诉查询急切加载返回用户的所有注释(在这种情况下,只是id为1的注释)。如果您没有急于加载它们,当您尝试访问它们时,它们将自动延迟加载。如果没有with('comments')
,上面的代码将完全相同。当您加载多个父记录时,急切加载变得更加重要,而不是只有一个,因为它解决了N + 1问题。您可以阅读eager loading here。
警告(我添加新答案的原因):
除非另有说明, User::find(1)->with('comments')->get();
不会提供您正在寻找的信息。这实际上最终将返回所有用户的评论急切加载。原因如下:
首先,User::find(1)
将返回id为1的一个用户,这很好。但是,它然后在此模型上调用with('comments')
,它实际上为users表创建了一个新的查询构建器实例。最后,它在这个新的查询构建器实例上调用get()
,并且由于它没有任何约束,它将返回表中的所有用户,并且所有注释都附加到那些急切加载的用户。 / p>
答案 1 :(得分:1)
首先找一个用户。然后访问所有用户数据和用户的所有评论。
$data = User::find(1);
//or you can use eager loading for more performance. thanks for @Özgür Adem Işıklı
$data = User::with('comments')->find(1);
//access user data
$data->id;
$data->email; //etc.
//user's comments:
foreach($data->comments as $comment) {
//access comment detail
$comment->id;
$comment->title;
}
答案 2 :(得分:1)
您正在获取您通过ID选择的用户的评论。你应该这样做;
import UIKit
struct Apps {
var name : String!
var img : String!
}
class clipsTableViewController: UITableViewController {
var tableData = [Apps]()
override func viewDidLoad() {
super.viewDidLoad()
let url = NSURL(string: "http://razavitv.aqr.ir/index/rss/2")
let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {(data, response, error) in
let dataString = NSString(data: data!, encoding: NSUTF8StringEncoding) as! String
let processedString = (dataString as NSString).stringByReplacingOccurrencesOfString("<![CDATA[", withString: "").stringByReplacingOccurrencesOfString("]]>", withString: "") as String
let data: NSData = processedString.dataUsingEncoding(NSUTF8StringEncoding)!
let xml = SWXMLHash.parse(data)
//one root element
let count = xml["rss"]["channel"]["item"].all.count
print(count)
for var i = 0; i < count; i++ {
let appName = xml["rss"]["channel"]["item"][i]["title"].element!.text!
let appUrl = xml["rss"]["channel"]["item"][i]["description"]["img"].element!.attributes["src"]
let ap = Apps(name: appName , img : appUrl)
self.tableData.append(ap)
self.tableView.reloadData()
}
}
task.resume()
}