标签: eloquent

Laravel雄辩并发现

为什么这不起作用?

Article::with('category')->find($ids)
Run Code Online (Sandbox Code Playgroud)

我有一个数组到字符串转换异常.

但是,如果我将查询分成两部分,如下所示:

$articles = Article::with('category')
Run Code Online (Sandbox Code Playgroud)

$articles = $articles->find($ids)
Run Code Online (Sandbox Code Playgroud)

我没有得到任何例外,结果是对的.

laravel eloquent

35
推荐指数
3
解决办法
4万
查看次数

Laravel自定义模型方法

每当我向Eloquent模型添加额外的逻辑时,我最终都必须使它成为一种static方法(即不太理想)才能从模型的外观中调用它.我已经尝试了很多关于如何以正确方式执行此操作的内容,并且几乎所有结果都讨论了创建返回Query Builder接口部分的方法.我试图弄清楚如何添加可以返回任何东西的方法,并使用模型的外观进行调用.

例如,假设我有一个名为的模型,Car并希望得到它们:

$cars = Car::all();
Run Code Online (Sandbox Code Playgroud)

好的,除了现在,假设我想通过make将结果排序为多维数组,所以我的结果可能如下所示:

$cars = array(
  'Ford' => array(
     'F-150' => '...',
     'Escape' => '...',
  ),
  'Honda' => array(
     'Accord' => '...',
     'Civic' => '...',
  ),
);
Run Code Online (Sandbox Code Playgroud)

以这个理论为例,我很想创建一个可以被称为的方法:

$cars = Car::getAllSortedByMake();
Run Code Online (Sandbox Code Playgroud)

让我们忘记一下可怕的方法名称以及它与数据结构紧密耦合的事实.如果我在模型中创建这样的方法:

public function getAllSortedByMake()
{
   // Process and return resulting array
   return array('...');
}
Run Code Online (Sandbox Code Playgroud)

最后在我的控制器中调用它,我将抛出此异常:

非静态方法Car :: getAllSortedByMake()不应该静态调用,假设$ this来自不兼容的上下文

TL; DR:我如何添加有意义的自定义功能,使其成为模型而不使其成为静态方法并使用模型的外观调用它?


编辑:

这是一个理论上的例子.也许这个问题的改写更有意义.为什么某些非静态方法在Eloquent模型的外观上是可用的,all()或者which()在模型中添加了其他方法?这意味着__call正在使用魔术方法,但是如何让它在模型中识别我自己的函数?

可能比"排序"更好的例子是,如果我需要对一段数据运行计算或算法:

$validSPG = Chemical::isValidSpecificGravity(-1.43);
Run Code Online (Sandbox Code Playgroud)

对我而言,这样的事情在模型中是有道理的,因为它是特定于域的.

php facade laravel eloquent laravel-4

35
推荐指数
2
解决办法
4万
查看次数

Laravel递归关系

我正在Laravel的一个项目上工作.我有一个帐户模型,可以有父母或可以有孩子,所以我的模型设置如下:

public function immediateChildAccounts()
{
    return $this->hasMany('Account', 'act_parent', 'act_id');
}

public function parentAccount()
{
    return $this->belongsTo('Account', 'act_parent', 'act_id');
}
Run Code Online (Sandbox Code Playgroud)

这很好用.我想做的是让所有孩子都在某个帐户下.目前,我这样做:

public function allChildAccounts()
{
    $childAccounts = $this->immediateChildAccounts;
    if (empty($childAccounts))
        return $childAccounts;

    foreach ($childAccounts as $child)
    {
        $child->load('immediateChildAccounts');
        $childAccounts = $childAccounts->merge($child->allChildAccounts());
    }

    return $childAccounts;
}
Run Code Online (Sandbox Code Playgroud)

这也有效,但我不得不担心它是否很慢.这个项目是我们在工作中使用的旧项目的重写.我们将有几千个帐户迁移到这个新项目.对于我所拥有的少数测试帐户,此方法不会产生任何性能问题.

有更好的解决方案吗?我应该只运行原始查询吗?是否Laravel有东西来处理呢?

总结 我想做什么,对于任何给定的帐户,是在单个列表/集合中获取每个子帐户及其子项的每个子项等.图:

A -> B -> D
|--> C -> E
     |--> F 
G -> H
Run Code Online (Sandbox Code Playgroud)

如果我运行A-> immediateChildAccounts(),我应该得到{B,C}
如果我运行A-> allChildAccounts(),我应该得到{B,D,C,E,F}(顺序无所谓)

同样,我的方法有效,但似乎我做了太多的查询.

另外,我不确定在这里问这个是否可以,但它是相关的.如何获取包含子帐户的所有帐户的列表?所以基本上是上述方法的逆.这是一个用户不会尝试给帐户一个已经是它的孩子的父母.使用上面的图表,我想要(在伪代码中):

Account :: where(account_id不在(A-> allChildAccounts())).所以我会{G,H} …

php laravel eloquent

35
推荐指数
5
解决办法
2万
查看次数

将Laravel 5 Eloquent模型移动到自己的目录中

Laravel 5默认在app文件夹中有ORM模型.我想把它们移到app/models中.当我这样做时,再也找不到这些类了.

如何让Laravel从app/models中找到Eloquent ORM模型?

php eloquent laravel-5

35
推荐指数
3
解决办法
2万
查看次数

如何通过laravel创建数据透视表

在Laravel 4中,当处理http://four.laravel.com/docs/eloquent#many-to-many中描述的多对多关系时,我怎样才能真正让Laravel为我创建数据透视表?

我是否需要在迁移中为所涉及的两个模型添加一些内容?我是否需要为数据透视表手动创建迁移?或者Laravel如何知道创建数据透视表?

到目前为止,我所做的就是将belongsToMany信息添加到两个相应的模型中,即

class User extends Eloquent 
{
    public function roles()
    {
         return $this->belongsToMany('Role');
     }
 }
Run Code Online (Sandbox Code Playgroud)

但是,这不会触发数据透视表的创建?我错过了什么步骤?

pivot-table laravel eloquent laravel-4

34
推荐指数
6
解决办法
4万
查看次数

Laravel:返回多态关系的命名空间所有者

我可以找到一些有关此问题的讨论,但没有明确的解决方案.这里有两个链接,虽然我将在这里讨论我自己的问题.

Github问题

Laravel.io讨论

简单说明

对于已经熟悉Laravel多态关系的人来说,这是对我的问题的简单解释.

当使用$ morphClass时,在尝试查找多态关系的所有者时,将$ morphClass的内容作为变体"type"保存在数据库中用于类名.这会导致错误,因为$ morphClass的整个点是它不是类的完全命名空间名称.

如何定义多态关系应该使用的类名?

更详细的说明

这是一个更详细的解释,准确地解释了我正在尝试做什么以及为什么我试图用例子来做.

在Laravel中使用多态关系时,无论保存为什么,数据库中的"morph_type"类型都被认为是类.

所以在这个例子中:

class Photo extends Eloquent {

    public function imageable()
    {
        return $this->morphTo();
    }

}

class Staff extends Eloquent {

    public function photos()
    {
        return $this->morphOne('Photo', 'imageable');
    }

}

class Order extends Eloquent {

    public function photos()
    {
        return $this->morphOne('Photo', 'imageable');
    }

}
Run Code Online (Sandbox Code Playgroud)

数据库看起来像这样:

staff

 - id - integer
 - name - string

orders

 - id - integer
 - price - integer

photos

 - id - integer
 - …
Run Code Online (Sandbox Code Playgroud)

polymorphism laravel eloquent laravel-4

34
推荐指数
4
解决办法
1万
查看次数

如何在Eloquent中检查行是否被软删除?

在Laravel 5.1中有一种很好的方法来检查一个雄辩的模型对象是否被软删除了吗?我不是在谈论选择数据,而是一旦我拥有了对象,例如Thing::withTrashed()->find($id)

到目前为止,我能看到的唯一方法是

if ($thing->deleted_at !== null) { ... }
Run Code Online (Sandbox Code Playgroud)

我没有在API中看到任何允许的相关方法

if ($thing->isDeleted()) { ... }
Run Code Online (Sandbox Code Playgroud)

php soft-delete laravel eloquent laravel-5.1

34
推荐指数
3
解决办法
2万
查看次数

Laravel,如何使用关系列的条件?

我正在使用Laravel并且在Eloquent ORM中遇到一个小问题.我可以使用JOIN简单地使用SQL查询,但我似乎无法使用Eloquent进行操作!

这就是我想要的,我有两个表格.一个是'餐馆',另一个是'Restaurant_Facilities'.

表很简单..和一对一的关系.像有一个restaurant带桌子id,name,slug,等,并叫另一台restaurant_facilitiesid,restaurant_id,wifi,parking,等

现在我想做的是..加载所有有wifi = 1或wifi = 0的餐馆..我怎么能用Eloquent做到这一点?我尝试过急切加载,数据透视表,(),集合(),似乎什么都没有用!

对于多对多关系我也有同样的问题cuisines!我有restaurant同桌,cuisine桌子和restaurant_cuisine_connection桌子..

但是如何使用它的ID加载特定菜肴中的所有餐馆?

这有效.

Cuisine::find(6)->restaurants()->get();

但我想从Restaurant :: model而不是菜肴中加载它...因为我有很多条件链接在一起..它用于搜索和过滤/浏览页面.

任何想法或方法?我一直在努力奋斗3天,仍然没有答案.

示例型号:

class Restaurant extends Eloquent {

    protected $table = 'restaurants';

    public function facilities() {
        return $this->hasOne('Facilities'); 
    }
}

class Facilities extends Eloquent {

    protected $table = 'restaurants_facilities';

    public function restaurant() {
        return $this->belongsTo('Restaurant');
    }

}
Run Code Online (Sandbox Code Playgroud)

PS:这似乎有效..但这不是Eloquent的方式吗?

Restaurant::leftJoin( …
Run Code Online (Sandbox Code Playgroud)

php laravel eloquent

33
推荐指数
4
解决办法
6万
查看次数

雄辩的laravel:如何从 - > get()获取行数

我在弄清楚如何使用这个集合来计算行数时遇到了很多麻烦.

$wordlist = \DB::table('wordlist')->where('id', '<=', $correctedComparisons)
                ->get();
Run Code Online (Sandbox Code Playgroud)

我尝试过adding->count()但没有奏效.我试过了count($wordlist).我不确定该做什么而不需要第二个请求作为a->count()方法.

php sql laravel eloquent

33
推荐指数
4
解决办法
9万
查看次数

Eloquent错误:尚未设置外观根

我已经成功地将Eloquent用作Slim Framework 2中的独立包.

但现在我想使用Illuminate\Support\Facades\DB,因为我需要通过从2个表中获取信息并使用数据库中的Left Join和Counter来显示一些统计信息,如下所示:

use Illuminate\Support\Facades\DB;
$projectsbyarea = DB::table('projects AS p')
        ->select(DB::raw('DISTINCT a.area, COUNT(a.area) AS Quantity'))
        ->leftJoin('areas AS a','p.area_id','=','a.id')
        ->where('p.status','in_process')
        ->where('a.area','<>','NULL')
        ->orderBy('p.area_id');
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Type: RuntimeException
Message: A facade root has not been set.
File: ...\vendor\illuminate\support\Facades\Facade.php
Line: 206
Run Code Online (Sandbox Code Playgroud)

我该如何解决?

到目前为止,我已经发现,在此链接中我需要创建一个新的应用程序容器,然后将其绑定到Facade.但我还没有找到如何让它发挥作用.

这就是我开始其余的Eloquent和工作正常的方式:

use Illuminate\Database\Capsule\Manager as Capsule;

$capsule = new Capsule();

$capsule->addConnection([
    'my'         =>  $app->config->get('settings'),
    /* more settings ...*/
]);

/*booting Eloquent*/
$capsule->bootEloquent();
Run Code Online (Sandbox Code Playgroud)

我该如何解决?

固定 为@ user5972059说,我不得不在$capsule->setAsGlobal();//This is important to make work the DB (Capsule)上面添加$capsule->bootEloquent();

然后,查询执行如下:

use …
Run Code Online (Sandbox Code Playgroud)

eloquent illuminate-container

33
推荐指数
8
解决办法
5万
查看次数