为什么这不起作用?
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)
我没有得到任何例外,结果是对的.
每当我向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)
对我而言,这样的事情在模型中是有道理的,因为它是特定于域的.
我正在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} …
Laravel 5默认在app文件夹中有ORM模型.我想把它们移到app/models中.当我这样做时,再也找不到这些类了.
如何让Laravel从app/models中找到Eloquent ORM模型?
在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)
但是,这不会触发数据透视表的创建?我错过了什么步骤?
我可以找到一些有关此问题的讨论,但没有明确的解决方案.这里有两个链接,虽然我将在这里讨论我自己的问题.
对于已经熟悉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) 在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) 我正在使用Laravel并且在Eloquent ORM中遇到一个小问题.我可以使用JOIN简单地使用SQL查询,但我似乎无法使用Eloquent进行操作!
这就是我想要的,我有两个表格.一个是'餐馆',另一个是'Restaurant_Facilities'.
表很简单..和一对一的关系.像有一个restaurant带桌子id,name,slug,等,并叫另一台restaurant_facilities用id,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) 我在弄清楚如何使用这个集合来计算行数时遇到了很多麻烦.
$wordlist = \DB::table('wordlist')->where('id', '<=', $correctedComparisons)
->get();
Run Code Online (Sandbox Code Playgroud)
我尝试过adding->count()但没有奏效.我试过了count($wordlist).我不确定该做什么而不需要第二个请求作为a->count()方法.
我已经成功地将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 ×10
laravel ×8
php ×6
laravel-4 ×3
facade ×1
laravel-5 ×1
laravel-5.1 ×1
pivot-table ×1
polymorphism ×1
soft-delete ×1
sql ×1