laravel雄辩的关系hasmany查询

时间:2016-01-06 08:23:03

标签: php laravel eloquent

我正在尝试实现 sql 查询

select * from user,comments where comments.user_id= user.id

所以我在我的用户模型上使用以下代码

创建一个getcomments方法
public function comments(){return $this->hasMany('Comments')}

现在正在通过

访问数据
$data = User::find(1)->comments;

但它只给了我评论表中的数据(不是用户和评论) 我怎么能这样做

3 个答案:

答案 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()
    }